Files
klz-cables.com/.pnpm-store/v10/files/3a/a72c2e2723cbdd2802f37e14066cb1264e19a4eef24d519e5bc181cacc78308769a89aec914b47c1577247c5a68fd99e5be6212d3fd6ccd7e52b55cde9f5c2
Marc Mintel 5397309103
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
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

1 line
15 KiB
Plaintext

{"version":3,"sources":["../../../../../src/versions/migrations/localizeStatus/mongo/up.ts"],"sourcesContent":["import type { Payload } from '../../../../types/index.js'\n\nimport { calculateVersionLocaleStatuses, type VersionRecord } from '../shared.js'\n\nexport type LocalizeStatusArgs = {\n collectionSlug?: string\n globalSlug?: string\n payload: Payload\n req?: any\n}\n\nexport async function up(args: LocalizeStatusArgs): Promise<void> {\n const { collectionSlug, globalSlug, payload, req } = 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 // MongoDB collection names are case-insensitive and stored as lowercase\n const versionsCollection = `_${entitySlug}_versions`.toLowerCase()\n\n if (!payload.config.localization) {\n throw new Error('Localization is not enabled in payload config')\n }\n\n // Check if versions are enabled on this collection/global\n let entityConfig\n if (collectionSlug) {\n const collection = payload.config.collections.find((c) => c.slug === collectionSlug)\n if (collection) {\n entityConfig = collection\n }\n } else if (globalSlug) {\n const global = payload.config.globals.find((g) => g.slug === globalSlug)\n if (global) {\n entityConfig = global\n }\n }\n\n if (!entityConfig) {\n throw new Error(\n `${collectionSlug ? 'Collection' : 'Global'} not found: ${collectionSlug || globalSlug}`,\n )\n }\n\n payload.logger.info({\n msg: `Starting _status localization migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug}`,\n })\n\n // Check if versions are enabled in config (skip if not)\n if (!entityConfig.versions) {\n payload.logger.info({\n msg: `Skipping migration for ${collectionSlug ? 'collection' : 'global'}: ${entitySlug} - versions not enabled`,\n })\n return\n }\n\n // Get MongoDB connection\n const connection = (payload.db as any).connection\n\n // Get filtered locales if filterAvailableLocales is defined\n let locales = payload.config.localization.localeCodes\n if (typeof payload.config.localization.filterAvailableLocales === 'function') {\n const filteredLocaleObjects = await payload.config.localization.filterAvailableLocales({\n locales: payload.config.localization.locales,\n req,\n })\n locales = filteredLocaleObjects.map((locale) => locale.code)\n }\n payload.logger.info({ msg: `Locales: ${locales.join(', ')}` })\n\n // Check if version._status exists and is NOT already localized\n const sampleDoc = await connection.collection(versionsCollection).findOne({})\n\n if (!sampleDoc) {\n payload.logger.info({ msg: 'No version documents found, nothing to migrate' })\n return\n }\n\n // Check if _status is already localized\n if (\n sampleDoc.version?._status &&\n typeof sampleDoc.version._status === 'object' &&\n !Array.isArray(sampleDoc.version._status)\n ) {\n payload.logger.info({\n msg: 'version._status is already localized, migration already completed',\n })\n return\n }\n\n // Validate that version._status exists and is a string\n if (\n !sampleDoc.version ||\n typeof sampleDoc.version._status !== 'string' ||\n Array.isArray(sampleDoc.version._status)\n ) {\n throw new Error(\n `Migration aborted: version._status field not found or has unexpected format in ${versionsCollection}. ` +\n `This migration should only run on schemas that have NOT yet been migrated to per-locale status.`,\n )\n }\n\n payload.logger.info({ msg: 'Fetching all version documents...' })\n\n // Get all versions, sorted chronologically\n const allVersions = await connection\n .collection(versionsCollection)\n .find({})\n .sort({ createdAt: 1, parent: 1 })\n .toArray()\n\n payload.logger.info({ msg: `Found ${allVersions.length} version documents` })\n\n // Transform MongoDB documents to VersionRecord format\n const versionRecords: VersionRecord[] = allVersions.map((doc: any) => ({\n id: doc._id.toString(),\n _status: doc.version._status as 'draft' | 'published',\n createdAt: doc.createdAt,\n parent: doc.parent?.toString(),\n publishedLocale: doc.publishedLocale,\n snapshot: doc.snapshot || false,\n }))\n\n // Calculate status per locale using shared logic\n const versionLocaleStatus = calculateVersionLocaleStatuses(versionRecords, locales, payload)\n\n payload.logger.info({ msg: 'Updating version documents with per-locale status...' })\n\n // Update each version document\n let updateCount = 0\n for (const doc of allVersions) {\n const versionId = doc._id.toString()\n const localeStatusMap = versionLocaleStatus.get(versionId)\n\n if (!localeStatusMap) {\n payload.logger.warn({ msg: `No status map found for version ${versionId}, skipping` })\n continue\n }\n\n // Build the new _status object: { en: 'published', es: 'draft', ... }\n const newStatus: Record<string, string> = {}\n for (const [locale, status] of localeStatusMap.entries()) {\n newStatus[locale] = status\n }\n\n // Update the document: change version._status from string to object\n await connection.collection(versionsCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n 'version._status': newStatus,\n },\n },\n )\n\n updateCount++\n }\n\n payload.logger.info({ msg: `Updated ${updateCount} version documents` })\n\n // Migrate main collection/global document _status to per-locale status object\n // Only if it has a status field\n if (collectionSlug) {\n const mainCollection = collectionSlug\n const mainDoc = await connection.collection(mainCollection).findOne({})\n\n if (mainDoc && '_status' in mainDoc) {\n payload.logger.info({ msg: `Migrating main collection documents for: ${mainCollection}` })\n\n const allDocs = await connection.collection(mainCollection).find({}).toArray()\n\n for (const doc of allDocs) {\n if (!doc._id) {\n continue\n }\n\n // Get the latest version for this document to determine status per locale\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({ parent: doc._id })\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n // Use the status from the latest version\n statusObj = latestVersions[0].version._status\n } else {\n // Fallback: set all locales to draft\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update main document\n await connection.collection(mainCollection).updateOne(\n { _id: doc._id },\n {\n $set: {\n _status: statusObj,\n },\n },\n )\n }\n\n payload.logger.info({ msg: `Migrated ${allDocs.length} collection documents` })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n } else if (globalSlug) {\n // Globals are stored in a single 'globals' collection with globalType discriminator\n const globalDoc = await connection.collection('globals').findOne({ globalType: globalSlug })\n if (globalDoc && '_status' in globalDoc && globalDoc._id) {\n payload.logger.info({ msg: `Migrating main global document for: ${globalSlug}` })\n\n // Get the latest version for the global\n const latestVersions = await connection\n .collection(versionsCollection)\n .find({})\n .sort({ createdAt: -1 })\n .limit(1)\n .toArray()\n\n let statusObj: Record<string, string> = {}\n\n if (latestVersions.length > 0 && latestVersions[0]?.version?._status) {\n statusObj = latestVersions[0].version._status\n } else {\n for (const locale of locales) {\n statusObj[locale] = 'draft'\n }\n }\n\n // Update global document\n await connection.collection('globals').updateOne(\n { _id: globalDoc._id, globalType: globalSlug },\n {\n $set: {\n _status: statusObj,\n },\n },\n )\n\n payload.logger.info({ msg: 'Migrated global document' })\n } else {\n payload.logger.info({\n msg: 'Skipping main document status migration (no status field found)',\n })\n }\n }\n\n payload.logger.info({ msg: 'Migration completed successfully' })\n}\n"],"names":["calculateVersionLocaleStatuses","up","args","collectionSlug","globalSlug","payload","req","Error","entitySlug","versionsCollection","toLowerCase","config","localization","entityConfig","collection","collections","find","c","slug","global","globals","g","logger","info","msg","versions","connection","db","locales","localeCodes","filterAvailableLocales","filteredLocaleObjects","map","locale","code","join","sampleDoc","findOne","version","_status","Array","isArray","allVersions","sort","createdAt","parent","toArray","length","versionRecords","doc","id","_id","toString","publishedLocale","snapshot","versionLocaleStatus","updateCount","versionId","localeStatusMap","get","warn","newStatus","status","entries","updateOne","$set","mainCollection","mainDoc","allDocs","latestVersions","limit","statusObj","globalDoc","globalType"],"mappings":"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"}