payload-wordpress-migrator 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/MigrationDashboardClient.js +2 -8
- package/dist/components/MigrationDashboardClient.js.map +1 -1
- package/dist/components/dashboard/SiteConfigPanel.d.ts +3 -9
- package/dist/components/dashboard/SiteConfigPanel.js +60 -170
- package/dist/components/dashboard/SiteConfigPanel.js.map +1 -1
- package/dist/components/dashboard/index.d.ts +1 -1
- package/dist/components/dashboard/types.d.ts +0 -8
- package/dist/components/dashboard/useMigrationDashboard.d.ts +2 -8
- package/dist/components/dashboard/useMigrationDashboard.js +33 -195
- package/dist/components/dashboard/useMigrationDashboard.js.map +1 -1
- package/dist/utils/endpoints/handlers.js +26 -15
- package/dist/utils/endpoints/handlers.js.map +1 -1
- package/dist/utils/migration/jobCrud.js +4 -4
- package/dist/utils/migration/jobCrud.js.map +1 -1
- package/dist/utils/migration/orchestrator.d.ts +2 -2
- package/dist/utils/migration/orchestrator.js +5 -5
- package/dist/utils/migration/orchestrator.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.js","sources":["../../../src/utils/endpoints/handlers.ts"],"sourcesContent":["/** API endpoint request handlers for WordPress migration operations. */\n\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport type { PayloadWordPressMigratorConfig } from '../../index.js'\n\nimport { analyzePayloadFields } from '../fields/analyzer.js'\nimport {\n checkRateLimit,\n createErrorResponse,\n createSuccessResponse,\n getContentCache,\n isCacheValid,\n parseRequestBody,\n requireAuth,\n requireMigrationAccess,\n setContentCache,\n validateWordPressCredentials,\n} from '../helpers/index.js'\nimport { MIGRATION_COLLECTION } from '../types.js'\nimport { WordPressClient } from '../wordpress/client.js'\n\nexport const wordpressConnectionHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n // Rate limit connection attempts to prevent credential brute-forcing\n const clientIp = req.headers?.get?.('x-forwarded-for') || req.headers?.get?.('x-real-ip') || 'unknown'\n if (!checkRateLimit(`wp-connection:${clientIp}`)) {\n return createErrorResponse('Too many connection attempts. Try again in 1 minute.', 429)\n }\n\n try {\n const body = await parseRequestBody(req)\n const credentials = validateWordPressCredentials(body)\n\n const client = new WordPressClient(credentials)\n const result = await client.testConnection()\n\n return createSuccessResponse(result, result.success ? 200 : 400)\n } catch (error) {\n req.payload.logger.error(`WordPress connection handler error: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const discoverWordPressContent = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n const body = await parseRequestBody(req)\n const credentials = validateWordPressCredentials(body)\n\n const client = new WordPressClient(credentials)\n const result = await client.discoverContent()\n\n if (result.success) {\n return createSuccessResponse({\n ...result.data,\n success: true,\n })\n } else {\n return createErrorResponse(result.error || 'Failed to discover content', 400)\n }\n } catch (error) {\n req.payload.logger.error(`Content discovery error: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const fetchWordPressContentFields = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n const body = await parseRequestBody(req)\n const { contentType } = body\n\n // Credentials from request body take priority, then fall back to plugin config (env vars)\n const wpSiteUrl = body.wpSiteUrl || pluginOptions.wpSiteUrl\n const wpUsername = body.wpUsername || pluginOptions.wpUsername\n const wpPassword = body.wpPassword || pluginOptions.wpPassword\n\n if (!wpSiteUrl || !wpUsername || !wpPassword) {\n throw new Error('WordPress credentials are required. Configure them in the plugin config or the dashboard Site Configuration panel.')\n }\n\n if (!contentType) {\n throw new Error('contentType is required')\n }\n\n const credentials = { wpPassword, wpSiteUrl, wpUsername }\n const client = new WordPressClient(credentials)\n const result = await client.fetchContentFields(contentType)\n\n if (result.success) {\n return createSuccessResponse({\n ...result.data,\n success: true,\n })\n } else {\n return createErrorResponse(result.error || 'Failed to fetch fields', 500)\n }\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const fetchPayloadCollectionFields = (req: PayloadRequest): Response => {\n const authError = requireAuth(req)\n if (authError) return authError\n\n try {\n // Extract slug from URL path parameter\n const url = new URL(req.url || '')\n const pathParts = url.pathname.split('/')\n const collectionsIndex = pathParts.indexOf('collections')\n const collectionSlug =\n collectionsIndex >= 0 && pathParts[collectionsIndex + 1]\n ? pathParts[collectionsIndex + 1]\n : null\n\n if (!collectionSlug) {\n return createErrorResponse('Collection slug is required')\n }\n\n // Access the collection configuration from the Payload config\n const collectionConfig = req.payload.config?.collections?.find(\n (collection: any) => collection.slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n return createErrorResponse(`Collection '${collectionSlug}' not found in config`, 404)\n }\n\n // Extract and format field information from the collection config\n const fields = analyzePayloadFields(collectionConfig.fields || [])\n\n return createSuccessResponse({\n collectionSlug,\n fields,\n success: true,\n })\n } catch (error) {\n req.payload.logger.error(`Error in fetchPayloadCollectionFields: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\n// Function to get migration summary data (for server components)\nexport const getMigrationSummaryData = async (forceRefresh = false, payload?: Payload) => {\n try {\n const now = Date.now()\n\n // Check for global cache invalidation from collection hooks\n let globalCacheInvalidated = false\n try {\n const { getLastCacheInvalidation } = await import('../../index.js')\n const lastInvalidation = getLastCacheInvalidation()\n const contentCache = getContentCache()\n globalCacheInvalidated = contentCache ? lastInvalidation > contentCache.timestamp : false\n } catch (error) {\n // Ignore import errors - fallback to local cache only\n }\n\n if (!forceRefresh && !globalCacheInvalidated && isCacheValid()) {\n const contentCache = getContentCache()\n return contentCache?.data\n }\n\n if (!payload) {\n throw new Error('Payload instance is required')\n }\n\n // Get migration jobs from database\n const jobs = await payload.find({\n collection: MIGRATION_COLLECTION,\n limit: 100,\n sort: '-createdAt',\n })\n\n // Collect recent logs from all jobs for centralized display\n const recentLogs: Array<{\n jobName: string\n level: string\n message: string\n timestamp: Date\n }> = []\n\n jobs.docs.forEach((job: any) => {\n if (job.logs && Array.isArray(job.logs)) {\n job.logs.forEach((log: any) => {\n recentLogs.push({\n jobName: job.jobName,\n level: log.level,\n message: log.message,\n timestamp: new Date(log.timestamp),\n })\n })\n }\n })\n\n // Sort logs by timestamp (newest first) and limit to recent 50\n recentLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n const limitedLogs = recentLogs.slice(0, 50)\n\n // Calculate summary statistics\n const activeJobs = jobs.docs.filter((job: any) => job.status === 'running').length\n const completedJobs = jobs.docs.filter((job: any) => job.status === 'completed').length\n const recentJobs = jobs.docs.slice(0, 10).map((job: any) => ({\n id: job.id,\n createdAt: job.createdAt,\n jobName: job.jobName,\n progress: job.progress || {\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n },\n status: job.status,\n }))\n\n const totalItemsMigrated = jobs.docs.reduce((total: number, job: any) => {\n return total + (job.progress?.successfulItems || 0)\n }, 0)\n\n const summary = {\n activeJobs,\n completedJobs,\n recentJobs,\n recentLogs: limitedLogs,\n totalItemsMigrated,\n totalJobs: jobs.totalDocs,\n totalSites: 1, // Single site configuration handled in dashboard\n }\n\n // Update cache\n setContentCache(summary)\n\n return summary\n } catch (error) {\n const msg = `Error fetching migration summary: ${error}`\n payload ? payload.logger.error(msg) : console.error(msg)\n throw error\n }\n}\n\nexport const migrationSummaryHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n // Check for refresh parameter\n const url = req.url || ''\n const forceRefresh = url.includes('refresh=true')\n\n const summary = await getMigrationSummaryData(forceRefresh, req.payload)\n\n return createSuccessResponse(summary)\n } catch (error) {\n req.payload.logger.error(`Error fetching migration summary: ${error}`)\n return createErrorResponse('Failed to fetch migration summary', 500)\n }\n}\n"],"names":["wordpressConnectionHandler","req","pluginOptions","authError","requireMigrationAccess","access","clientIp","headers","get","checkRateLimit","createErrorResponse","body","parseRequestBody","credentials","validateWordPressCredentials","client","WordPressClient","result","testConnection","createSuccessResponse","success","error","payload","logger","Error","String","discoverWordPressContent","discoverContent","data","fetchWordPressContentFields","contentType","wpSiteUrl","wpUsername","wpPassword","fetchContentFields","fetchPayloadCollectionFields","requireAuth","url","URL","pathParts","pathname","split","collectionsIndex","indexOf","collectionSlug","collectionConfig","config","collections","find","collection","slug","fields","analyzePayloadFields","getMigrationSummaryData","forceRefresh","now","Date","globalCacheInvalidated","getLastCacheInvalidation","lastInvalidation","contentCache","getContentCache","timestamp","isCacheValid","jobs","MIGRATION_COLLECTION","limit","sort","recentLogs","docs","forEach","job","logs","Array","isArray","log","push","jobName","level","message","a","b","getTime","limitedLogs","slice","activeJobs","filter","status","length","completedJobs","recentJobs","map","id","createdAt","progress","processedItems","successfulItems","totalItems","totalItemsMigrated","reduce","total","summary","totalJobs","totalDocs","totalSites","setContentCache","msg","console","migrationSummaryHandler","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"handlers.js","sources":["../../../src/utils/endpoints/handlers.ts"],"sourcesContent":["/** API endpoint request handlers for WordPress migration operations. */\n\nimport type { Payload, PayloadRequest } from 'payload'\n\nimport type { PayloadWordPressMigratorConfig } from '../../index.js'\n\nimport { analyzePayloadFields } from '../fields/analyzer.js'\nimport {\n checkRateLimit,\n createErrorResponse,\n createSuccessResponse,\n getContentCache,\n isCacheValid,\n parseRequestBody,\n requireAuth,\n requireMigrationAccess,\n setContentCache,\n} from '../helpers/index.js'\nimport { MIGRATION_COLLECTION } from '../types.js'\nimport { WordPressClient } from '../wordpress/client.js'\n\nexport const wordpressConnectionHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n // Rate limit connection attempts to prevent credential brute-forcing\n const clientIp = req.headers?.get?.('x-forwarded-for') || req.headers?.get?.('x-real-ip') || 'unknown'\n if (!checkRateLimit(`wp-connection:${clientIp}`)) {\n return createErrorResponse('Too many connection attempts. Try again in 1 minute.', 429)\n }\n\n try {\n const { wpSiteUrl, wpUsername, wpPassword } = pluginOptions\n if (!wpSiteUrl || !wpUsername || !wpPassword) {\n return createErrorResponse('WordPress credentials not configured. Set wpSiteUrl, wpUsername, and wpPassword in the plugin config.', 400)\n }\n\n const client = new WordPressClient({ wpSiteUrl, wpUsername, wpPassword })\n const result = await client.testConnection()\n\n return createSuccessResponse(result, result.success ? 200 : 400)\n } catch (error) {\n req.payload.logger.error(`WordPress connection handler error: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const discoverWordPressContent = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n const { wpSiteUrl, wpUsername, wpPassword } = pluginOptions\n if (!wpSiteUrl || !wpUsername || !wpPassword) {\n return createErrorResponse('WordPress credentials not configured. Set wpSiteUrl, wpUsername, and wpPassword in the plugin config.', 400)\n }\n\n const client = new WordPressClient({ wpSiteUrl, wpUsername, wpPassword })\n const result = await client.discoverContent()\n\n if (result.success) {\n return createSuccessResponse({\n ...result.data,\n success: true,\n })\n } else {\n return createErrorResponse(result.error || 'Failed to discover content', 400)\n }\n } catch (error) {\n req.payload.logger.error(`Content discovery error: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const fetchWordPressContentFields = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n const body = await parseRequestBody(req)\n const { contentType } = body\n\n if (!contentType) {\n throw new Error('contentType is required')\n }\n\n const wpSiteUrl = pluginOptions.wpSiteUrl\n const wpUsername = pluginOptions.wpUsername\n const wpPassword = pluginOptions.wpPassword\n\n if (!wpSiteUrl || !wpUsername || !wpPassword) {\n throw new Error('WordPress credentials not configured. Set wpSiteUrl, wpUsername, and wpPassword in the plugin config.')\n }\n\n const credentials = { wpPassword, wpSiteUrl, wpUsername }\n const client = new WordPressClient(credentials)\n const result = await client.fetchContentFields(contentType)\n\n if (result.success) {\n return createSuccessResponse({\n ...result.data,\n success: true,\n })\n } else {\n return createErrorResponse(result.error || 'Failed to fetch fields', 500)\n }\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nexport const fetchPayloadCollectionFields = (req: PayloadRequest): Response => {\n const authError = requireAuth(req)\n if (authError) return authError\n\n try {\n // Extract slug from URL path parameter\n const url = new URL(req.url || '')\n const pathParts = url.pathname.split('/')\n const collectionsIndex = pathParts.indexOf('collections')\n const collectionSlug =\n collectionsIndex >= 0 && pathParts[collectionsIndex + 1]\n ? pathParts[collectionsIndex + 1]\n : null\n\n if (!collectionSlug) {\n return createErrorResponse('Collection slug is required')\n }\n\n // Access the collection configuration from the Payload config\n const collectionConfig = req.payload.config?.collections?.find(\n (collection: any) => collection.slug === collectionSlug,\n )\n\n if (!collectionConfig) {\n return createErrorResponse(`Collection '${collectionSlug}' not found in config`, 404)\n }\n\n // Extract and format field information from the collection config\n const fields = analyzePayloadFields(collectionConfig.fields || [])\n\n return createSuccessResponse({\n collectionSlug,\n fields,\n success: true,\n })\n } catch (error) {\n req.payload.logger.error(`Error in fetchPayloadCollectionFields: ${error}`)\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\n// Function to get migration summary data (for server components)\nexport const getMigrationSummaryData = async (forceRefresh = false, payload?: Payload) => {\n try {\n const now = Date.now()\n\n // Check for global cache invalidation from collection hooks\n let globalCacheInvalidated = false\n try {\n const { getLastCacheInvalidation } = await import('../../index.js')\n const lastInvalidation = getLastCacheInvalidation()\n const contentCache = getContentCache()\n globalCacheInvalidated = contentCache ? lastInvalidation > contentCache.timestamp : false\n } catch (error) {\n // Ignore import errors - fallback to local cache only\n }\n\n if (!forceRefresh && !globalCacheInvalidated && isCacheValid()) {\n const contentCache = getContentCache()\n return contentCache?.data\n }\n\n if (!payload) {\n throw new Error('Payload instance is required')\n }\n\n // Get migration jobs from database\n const jobs = await payload.find({\n collection: MIGRATION_COLLECTION,\n limit: 100,\n sort: '-createdAt',\n })\n\n // Collect recent logs from all jobs for centralized display\n const recentLogs: Array<{\n jobName: string\n level: string\n message: string\n timestamp: Date\n }> = []\n\n jobs.docs.forEach((job: any) => {\n if (job.logs && Array.isArray(job.logs)) {\n job.logs.forEach((log: any) => {\n recentLogs.push({\n jobName: job.jobName,\n level: log.level,\n message: log.message,\n timestamp: new Date(log.timestamp),\n })\n })\n }\n })\n\n // Sort logs by timestamp (newest first) and limit to recent 50\n recentLogs.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())\n const limitedLogs = recentLogs.slice(0, 50)\n\n // Calculate summary statistics\n const activeJobs = jobs.docs.filter((job: any) => job.status === 'running').length\n const completedJobs = jobs.docs.filter((job: any) => job.status === 'completed').length\n const recentJobs = jobs.docs.slice(0, 10).map((job: any) => ({\n id: job.id,\n createdAt: job.createdAt,\n jobName: job.jobName,\n progress: job.progress || {\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n },\n status: job.status,\n }))\n\n const totalItemsMigrated = jobs.docs.reduce((total: number, job: any) => {\n return total + (job.progress?.successfulItems || 0)\n }, 0)\n\n const summary = {\n activeJobs,\n completedJobs,\n recentJobs,\n recentLogs: limitedLogs,\n totalItemsMigrated,\n totalJobs: jobs.totalDocs,\n totalSites: 1, // Single site configuration handled in dashboard\n }\n\n // Update cache\n setContentCache(summary)\n\n return summary\n } catch (error) {\n const msg = `Error fetching migration summary: ${error}`\n payload ? payload.logger.error(msg) : console.error(msg)\n throw error\n }\n}\n\nexport const migrationSummaryHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n try {\n // Check for refresh parameter\n const url = req.url || ''\n const forceRefresh = url.includes('refresh=true')\n\n const summary = await getMigrationSummaryData(forceRefresh, req.payload)\n\n return createSuccessResponse(summary)\n } catch (error) {\n req.payload.logger.error(`Error fetching migration summary: ${error}`)\n return createErrorResponse('Failed to fetch migration summary', 500)\n }\n}\n"],"names":["wordpressConnectionHandler","req","pluginOptions","authError","requireMigrationAccess","access","clientIp","headers","get","checkRateLimit","createErrorResponse","wpSiteUrl","wpUsername","wpPassword","client","WordPressClient","result","testConnection","createSuccessResponse","success","error","payload","logger","Error","String","discoverWordPressContent","discoverContent","data","fetchWordPressContentFields","body","parseRequestBody","contentType","credentials","fetchContentFields","fetchPayloadCollectionFields","requireAuth","url","URL","pathParts","pathname","split","collectionsIndex","indexOf","collectionSlug","collectionConfig","config","collections","find","collection","slug","fields","analyzePayloadFields","getMigrationSummaryData","forceRefresh","now","Date","globalCacheInvalidated","getLastCacheInvalidation","lastInvalidation","contentCache","getContentCache","timestamp","isCacheValid","jobs","MIGRATION_COLLECTION","limit","sort","recentLogs","docs","forEach","job","logs","Array","isArray","log","push","jobName","level","message","a","b","getTime","limitedLogs","slice","activeJobs","filter","status","length","completedJobs","recentJobs","map","id","createdAt","progress","processedItems","successfulItems","totalItems","totalItemsMigrated","reduce","total","summary","totalJobs","totalDocs","totalSites","setContentCache","msg","console","migrationSummaryHandler","includes"],"mappings":"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"}
|
|
@@ -40,12 +40,12 @@ const migrationJobHandler = async (req, pluginOptions)=>{
|
|
|
40
40
|
const startMigrationJob = async (req, pluginOptions)=>{
|
|
41
41
|
try {
|
|
42
42
|
const body = await parseRequestBody(req);
|
|
43
|
-
const { action, jobId
|
|
43
|
+
const { action, jobId } = body;
|
|
44
44
|
if (!jobId) {
|
|
45
45
|
return createErrorResponse('jobId is required');
|
|
46
46
|
}
|
|
47
|
-
if (!
|
|
48
|
-
return createErrorResponse('WordPress
|
|
47
|
+
if (!pluginOptions.wpSiteUrl || !pluginOptions.wpUsername || !pluginOptions.wpPassword) {
|
|
48
|
+
return createErrorResponse('WordPress credentials not configured. Set wpSiteUrl, wpUsername, and wpPassword in the plugin config.');
|
|
49
49
|
}
|
|
50
50
|
const job = await req.payload.findByID({
|
|
51
51
|
id: jobId,
|
|
@@ -153,7 +153,7 @@ const startMigrationJob = async (req, pluginOptions)=>{
|
|
|
153
153
|
data: updateData
|
|
154
154
|
});
|
|
155
155
|
invalidateMigrationCache();
|
|
156
|
-
void processMigrationJob(jobId, job, req.payload, pluginOptions,
|
|
156
|
+
void processMigrationJob(jobId, job, req.payload, pluginOptions, action).catch(async (error)=>{
|
|
157
157
|
req.payload.logger.error(`Migration job ${jobId} failed: ${error}`);
|
|
158
158
|
try {
|
|
159
159
|
const freshJob = await req.payload.findByID({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jobCrud.js","sources":["../../../src/utils/migration/jobCrud.ts"],"sourcesContent":["/** CRUD operations and status management for WordPress migration jobs. */\n\nimport type { PayloadRequest } from 'payload'\n\nimport type { PayloadWordPressMigratorConfig } from '../../index.js'\n\nimport { createErrorResponse, createSuccessResponse, invalidateMigrationCache, parseRequestBody, requireMigrationAccess } from '../helpers/index.js'\nimport type { MigrationJob } from '../types.js'\nimport { MIGRATION_COLLECTION } from '../types.js'\nimport { processMigrationJob } from './orchestrator.js'\n\nexport const migrationJobHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n const { method } = req\n const { action, jobId } = req.query || {}\n\n try {\n switch (method) {\n case 'DELETE':\n if (!jobId) {\n return createErrorResponse('jobId is required for DELETE requests')\n }\n return await deleteMigrationJob(jobId as string, req)\n case 'GET':\n if (!jobId) {\n return createErrorResponse('jobId is required for GET requests')\n }\n return await getMigrationJobStatus(jobId as string, req)\n case 'POST':\n return await startMigrationJob(req, pluginOptions)\n case 'PUT':\n if (!jobId || !action) {\n return createErrorResponse('jobId and action are required for PUT requests')\n }\n return await updateMigrationJob(jobId as string, action as string, req)\n default:\n return new Response('Method not allowed', { status: 405 })\n }\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst startMigrationJob = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n try {\n const body = await parseRequestBody(req)\n const { action, jobId, siteConfig } = body\n\n if (!jobId) {\n return createErrorResponse('jobId is required')\n }\n\n if (!siteConfig || !siteConfig.wpSiteUrl || !siteConfig.wpUsername || !siteConfig.wpPassword) {\n return createErrorResponse(\n 'WordPress site configuration is required. Please configure your WordPress site in the dashboard first.',\n )\n }\n\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n // Rollback is a distinct action — delegate and return early\n if (action === 'rollback') {\n return await rollbackMigrationJob(jobId, req)\n }\n\n // Prevent concurrent jobs on the same target collection\n const runningJobs = await req.payload.find({\n collection: MIGRATION_COLLECTION,\n limit: 1,\n where: {\n id: { not_equals: jobId },\n status: { equals: 'running' },\n targetCollection: { equals: job.targetCollection },\n },\n })\n\n if (runningJobs.totalDocs > 0) {\n return createErrorResponse(\n `Another migration job (\"${(runningJobs.docs[0] as MigrationJob).jobName}\") is already running on the \"${job.targetCollection}\" collection. Wait for it to complete or pause it first.`,\n 409,\n )\n }\n\n const updateData: Record<string, unknown> = {\n status: 'running',\n }\n\n if (action === 'retry') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Retrying migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'restart') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.endTime = null\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Restarting completed migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'resume') {\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Resuming migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'update') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Starting selective update for existing ${job.contentType} posts (missing fields only)`,\n timestamp: new Date(),\n },\n ]\n } else {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: updateData,\n })\n\n invalidateMigrationCache()\n\n void processMigrationJob(jobId, job, req.payload, pluginOptions, siteConfig, action).catch(\n async (error) => {\n req.payload.logger.error(`Migration job ${jobId} failed: ${error}`)\n try {\n const freshJob = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: {\n logs: [\n ...(freshJob?.logs || []),\n {\n level: 'error',\n message: `Migration failed: ${error.message}`,\n timestamp: new Date(),\n },\n ],\n status: 'failed',\n },\n })\n } catch (updateError) {\n req.payload.logger.error(`Failed to update job ${jobId} status: ${updateError}`)\n }\n },\n )\n\n const result = {\n jobId,\n message:\n action === 'retry'\n ? `Migration job ${jobId} retry started successfully`\n : action === 'resume'\n ? `Migration job ${jobId} resumed successfully`\n : `Migration job ${jobId} started successfully`,\n status: 'running',\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst updateMigrationJob = async (\n jobId: string,\n action: string,\n req: PayloadRequest,\n): Promise<Response> => {\n try {\n let newStatus = 'unknown'\n if (action === 'pause') {\n newStatus = 'paused'\n } else if (action === 'resume') {\n newStatus = 'running'\n }\n\n const currentJob = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n\n const updateData: Record<string, unknown> = {\n lastUpdate: new Date(),\n status: newStatus,\n }\n\n if (action === 'pause') {\n const progress = currentJob.progress || { processedItems: 0, totalItems: 0 }\n updateData.logs = [\n ...(currentJob.logs || []),\n {\n level: 'info',\n message: `Migration paused by user at ${progress.processedItems}/${progress.totalItems} items`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'resume') {\n updateData.logs = [\n ...(currentJob.logs || []),\n {\n level: 'info',\n message: `Migration resume requested by user`,\n timestamp: new Date(),\n },\n ]\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: updateData,\n })\n\n invalidateMigrationCache()\n\n const result = {\n action,\n jobId,\n message: `Migration job ${jobId} ${action}d successfully`,\n status: newStatus,\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst getMigrationJobStatus = async (jobId: string, req: PayloadRequest): Promise<Response> => {\n try {\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n const result = {\n id: job.id,\n lastUpdate: job.updatedAt,\n progress: job.progress || {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n },\n startTime: job.startTime || job.createdAt,\n status: job.status,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst deleteMigrationJob = async (jobId: string, req: PayloadRequest): Promise<Response> => {\n try {\n const job = await req.payload\n .findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n .catch((error: any) => {\n if (error?.status === 404 || error?.message?.includes('not found')) return null\n throw error\n })\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n if ((job as MigrationJob).status === 'running') {\n return createErrorResponse('Cannot delete a running migration job. Please pause it first.')\n }\n\n await req.payload.delete({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n\n invalidateMigrationCache()\n\n const result = {\n jobId,\n message: `Migration job ${jobId} deleted successfully`,\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst rollbackMigrationJob = async (\n jobId: string,\n req: PayloadRequest,\n): Promise<Response> => {\n try {\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n if (job.status === 'running') {\n return createErrorResponse('Cannot rollback a running job. Pause it first.', 400)\n }\n\n // Find all items created by this job via migration metadata\n const countResult = await req.payload.find({\n collection: job.targetCollection,\n limit: 0,\n where: {\n 'migratedFromWordPress.wpPostType': { equals: job.contentType },\n },\n })\n\n if (countResult.totalDocs === 0) {\n return createSuccessResponse({ deleted: 0, message: 'No migrated items found to rollback' })\n }\n\n // Paginated delete — fetch and delete in pages to avoid loading all items into memory\n let deleted = 0\n let hasMore = true\n\n while (hasMore) {\n const items = await req.payload.find({\n collection: job.targetCollection,\n limit: 100,\n page: 1, // Always page 1 since we're deleting as we go\n where: {\n 'migratedFromWordPress.wpPostType': { equals: job.contentType },\n },\n })\n\n if (items.docs.length === 0) break\n\n for (const item of items.docs) {\n try {\n await req.payload.delete({ collection: job.targetCollection, id: item.id })\n deleted++\n } catch {\n // Partial rollback is better than none — continue on individual failures\n }\n }\n\n hasMore = items.totalDocs > items.docs.length\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: { status: 'rolled_back' },\n })\n\n invalidateMigrationCache()\n\n return createSuccessResponse({ deleted, message: `Rolled back ${deleted} items` })\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n"],"names":["migrationJobHandler","req","pluginOptions","authError","requireMigrationAccess","access","method","action","jobId","query","createErrorResponse","deleteMigrationJob","getMigrationJobStatus","startMigrationJob","updateMigrationJob","Response","status","error","Error","String","body","parseRequestBody","siteConfig","wpSiteUrl","wpUsername","wpPassword","job","payload","findByID","id","collection","MIGRATION_COLLECTION","rollbackMigrationJob","runningJobs","find","limit","where","not_equals","equals","targetCollection","totalDocs","docs","jobName","updateData","progress","failedItems","processedItems","successfulItems","totalItems","startTime","Date","logs","level","message","contentType","timestamp","endTime","update","data","invalidateMigrationCache","processMigrationJob","catch","logger","freshJob","updateError","result","success","createSuccessResponse","newStatus","currentJob","lastUpdate","updatedAt","createdAt","includes","delete","countResult","deleted","hasMore","items","page","length","item"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"jobCrud.js","sources":["../../../src/utils/migration/jobCrud.ts"],"sourcesContent":["/** CRUD operations and status management for WordPress migration jobs. */\n\nimport type { PayloadRequest } from 'payload'\n\nimport type { PayloadWordPressMigratorConfig } from '../../index.js'\n\nimport { createErrorResponse, createSuccessResponse, invalidateMigrationCache, parseRequestBody, requireMigrationAccess } from '../helpers/index.js'\nimport type { MigrationJob } from '../types.js'\nimport { MIGRATION_COLLECTION } from '../types.js'\nimport { processMigrationJob } from './orchestrator.js'\n\nexport const migrationJobHandler = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n const authError = await requireMigrationAccess(req, pluginOptions.access)\n if (authError) return authError\n\n const { method } = req\n const { action, jobId } = req.query || {}\n\n try {\n switch (method) {\n case 'DELETE':\n if (!jobId) {\n return createErrorResponse('jobId is required for DELETE requests')\n }\n return await deleteMigrationJob(jobId as string, req)\n case 'GET':\n if (!jobId) {\n return createErrorResponse('jobId is required for GET requests')\n }\n return await getMigrationJobStatus(jobId as string, req)\n case 'POST':\n return await startMigrationJob(req, pluginOptions)\n case 'PUT':\n if (!jobId || !action) {\n return createErrorResponse('jobId and action are required for PUT requests')\n }\n return await updateMigrationJob(jobId as string, action as string, req)\n default:\n return new Response('Method not allowed', { status: 405 })\n }\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst startMigrationJob = async (\n req: PayloadRequest,\n pluginOptions: PayloadWordPressMigratorConfig,\n): Promise<Response> => {\n try {\n const body = await parseRequestBody(req)\n const { action, jobId } = body\n\n if (!jobId) {\n return createErrorResponse('jobId is required')\n }\n\n if (!pluginOptions.wpSiteUrl || !pluginOptions.wpUsername || !pluginOptions.wpPassword) {\n return createErrorResponse(\n 'WordPress credentials not configured. Set wpSiteUrl, wpUsername, and wpPassword in the plugin config.',\n )\n }\n\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n // Rollback is a distinct action — delegate and return early\n if (action === 'rollback') {\n return await rollbackMigrationJob(jobId, req)\n }\n\n // Prevent concurrent jobs on the same target collection\n const runningJobs = await req.payload.find({\n collection: MIGRATION_COLLECTION,\n limit: 1,\n where: {\n id: { not_equals: jobId },\n status: { equals: 'running' },\n targetCollection: { equals: job.targetCollection },\n },\n })\n\n if (runningJobs.totalDocs > 0) {\n return createErrorResponse(\n `Another migration job (\"${(runningJobs.docs[0] as MigrationJob).jobName}\") is already running on the \"${job.targetCollection}\" collection. Wait for it to complete or pause it first.`,\n 409,\n )\n }\n\n const updateData: Record<string, unknown> = {\n status: 'running',\n }\n\n if (action === 'retry') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Retrying migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'restart') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.endTime = null\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Restarting completed migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'resume') {\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Resuming migration job for ${job.contentType}`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'update') {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n updateData.logs = [\n ...(job.logs || []),\n {\n level: 'info',\n message: `Starting selective update for existing ${job.contentType} posts (missing fields only)`,\n timestamp: new Date(),\n },\n ]\n } else {\n updateData.progress = {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n }\n updateData.startTime = new Date()\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: updateData,\n })\n\n invalidateMigrationCache()\n\n void processMigrationJob(jobId, job, req.payload, pluginOptions, action).catch(\n async (error) => {\n req.payload.logger.error(`Migration job ${jobId} failed: ${error}`)\n try {\n const freshJob = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: {\n logs: [\n ...(freshJob?.logs || []),\n {\n level: 'error',\n message: `Migration failed: ${error.message}`,\n timestamp: new Date(),\n },\n ],\n status: 'failed',\n },\n })\n } catch (updateError) {\n req.payload.logger.error(`Failed to update job ${jobId} status: ${updateError}`)\n }\n },\n )\n\n const result = {\n jobId,\n message:\n action === 'retry'\n ? `Migration job ${jobId} retry started successfully`\n : action === 'resume'\n ? `Migration job ${jobId} resumed successfully`\n : `Migration job ${jobId} started successfully`,\n status: 'running',\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst updateMigrationJob = async (\n jobId: string,\n action: string,\n req: PayloadRequest,\n): Promise<Response> => {\n try {\n let newStatus = 'unknown'\n if (action === 'pause') {\n newStatus = 'paused'\n } else if (action === 'resume') {\n newStatus = 'running'\n }\n\n const currentJob = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n\n const updateData: Record<string, unknown> = {\n lastUpdate: new Date(),\n status: newStatus,\n }\n\n if (action === 'pause') {\n const progress = currentJob.progress || { processedItems: 0, totalItems: 0 }\n updateData.logs = [\n ...(currentJob.logs || []),\n {\n level: 'info',\n message: `Migration paused by user at ${progress.processedItems}/${progress.totalItems} items`,\n timestamp: new Date(),\n },\n ]\n } else if (action === 'resume') {\n updateData.logs = [\n ...(currentJob.logs || []),\n {\n level: 'info',\n message: `Migration resume requested by user`,\n timestamp: new Date(),\n },\n ]\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: updateData,\n })\n\n invalidateMigrationCache()\n\n const result = {\n action,\n jobId,\n message: `Migration job ${jobId} ${action}d successfully`,\n status: newStatus,\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst getMigrationJobStatus = async (jobId: string, req: PayloadRequest): Promise<Response> => {\n try {\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n const result = {\n id: job.id,\n lastUpdate: job.updatedAt,\n progress: job.progress || {\n failedItems: 0,\n processedItems: 0,\n successfulItems: 0,\n totalItems: 0,\n },\n startTime: job.startTime || job.createdAt,\n status: job.status,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst deleteMigrationJob = async (jobId: string, req: PayloadRequest): Promise<Response> => {\n try {\n const job = await req.payload\n .findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n .catch((error: any) => {\n if (error?.status === 404 || error?.message?.includes('not found')) return null\n throw error\n })\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n if ((job as MigrationJob).status === 'running') {\n return createErrorResponse('Cannot delete a running migration job. Please pause it first.')\n }\n\n await req.payload.delete({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n })\n\n invalidateMigrationCache()\n\n const result = {\n jobId,\n message: `Migration job ${jobId} deleted successfully`,\n success: true,\n }\n\n return createSuccessResponse(result)\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n\nconst rollbackMigrationJob = async (\n jobId: string,\n req: PayloadRequest,\n): Promise<Response> => {\n try {\n const job = await req.payload.findByID({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n }) as MigrationJob\n\n if (!job) {\n return createErrorResponse('Migration job not found', 404)\n }\n\n if (job.status === 'running') {\n return createErrorResponse('Cannot rollback a running job. Pause it first.', 400)\n }\n\n // Find all items created by this job via migration metadata\n const countResult = await req.payload.find({\n collection: job.targetCollection,\n limit: 0,\n where: {\n 'migratedFromWordPress.wpPostType': { equals: job.contentType },\n },\n })\n\n if (countResult.totalDocs === 0) {\n return createSuccessResponse({ deleted: 0, message: 'No migrated items found to rollback' })\n }\n\n // Paginated delete — fetch and delete in pages to avoid loading all items into memory\n let deleted = 0\n let hasMore = true\n\n while (hasMore) {\n const items = await req.payload.find({\n collection: job.targetCollection,\n limit: 100,\n page: 1, // Always page 1 since we're deleting as we go\n where: {\n 'migratedFromWordPress.wpPostType': { equals: job.contentType },\n },\n })\n\n if (items.docs.length === 0) break\n\n for (const item of items.docs) {\n try {\n await req.payload.delete({ collection: job.targetCollection, id: item.id })\n deleted++\n } catch {\n // Partial rollback is better than none — continue on individual failures\n }\n }\n\n hasMore = items.totalDocs > items.docs.length\n }\n\n await req.payload.update({\n id: jobId,\n collection: MIGRATION_COLLECTION,\n data: { status: 'rolled_back' },\n })\n\n invalidateMigrationCache()\n\n return createSuccessResponse({ deleted, message: `Rolled back ${deleted} items` })\n } catch (error) {\n return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500)\n }\n}\n"],"names":["migrationJobHandler","req","pluginOptions","authError","requireMigrationAccess","access","method","action","jobId","query","createErrorResponse","deleteMigrationJob","getMigrationJobStatus","startMigrationJob","updateMigrationJob","Response","status","error","Error","String","body","parseRequestBody","wpSiteUrl","wpUsername","wpPassword","job","payload","findByID","id","collection","MIGRATION_COLLECTION","rollbackMigrationJob","runningJobs","find","limit","where","not_equals","equals","targetCollection","totalDocs","docs","jobName","updateData","progress","failedItems","processedItems","successfulItems","totalItems","startTime","Date","logs","level","message","contentType","timestamp","endTime","update","data","invalidateMigrationCache","processMigrationJob","catch","logger","freshJob","updateError","result","success","createSuccessResponse","newStatus","currentJob","lastUpdate","updatedAt","createdAt","includes","delete","countResult","deleted","hasMore","items","page","length","item"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Core migration orchestration: fetch WordPress content in batches, transform, deduplicate, and create in PayloadCMS. */
|
|
2
2
|
import type { Payload } from 'payload';
|
|
3
3
|
import type { PayloadWordPressMigratorConfig } from '../../index.js';
|
|
4
|
-
import type { MigrationJob
|
|
5
|
-
export declare const processMigrationJob: (jobId: string, job: MigrationJob, payload: Payload, pluginOptions: PayloadWordPressMigratorConfig,
|
|
4
|
+
import type { MigrationJob } from '../types.js';
|
|
5
|
+
export declare const processMigrationJob: (jobId: string, job: MigrationJob, payload: Payload, pluginOptions: PayloadWordPressMigratorConfig, action?: string) => Promise<void>;
|
|
@@ -416,17 +416,17 @@ const processBatch = async (batch, job, payload, pluginOptions, client, counters
|
|
|
416
416
|
// ---------------------------------------------------------------------------
|
|
417
417
|
// Main orchestrator
|
|
418
418
|
// ---------------------------------------------------------------------------
|
|
419
|
-
const processMigrationJob = async (jobId, job, payload, pluginOptions,
|
|
419
|
+
const processMigrationJob = async (jobId, job, payload, pluginOptions, action)=>{
|
|
420
420
|
try {
|
|
421
421
|
const client = new WordPressClient({
|
|
422
|
-
wpPassword:
|
|
423
|
-
wpSiteUrl:
|
|
424
|
-
wpUsername:
|
|
422
|
+
wpPassword: pluginOptions.wpPassword,
|
|
423
|
+
wpSiteUrl: pluginOptions.wpSiteUrl,
|
|
424
|
+
wpUsername: pluginOptions.wpUsername
|
|
425
425
|
});
|
|
426
426
|
const batchSize = job.configuration?.batchSize || pluginOptions.migrationBatchSize || 10;
|
|
427
427
|
const batchDelay = job.configuration?.batchDelay ?? 200;
|
|
428
428
|
const requestDelay = job.configuration?.requestDelay || pluginOptions.wpRequestDelay || 0;
|
|
429
|
-
addJobLog('info', `Starting migration for ${job.contentType} from ${
|
|
429
|
+
addJobLog('info', `Starting migration for ${job.contentType} from ${pluginOptions.wpSiteUrl || 'WordPress Site'}`);
|
|
430
430
|
invalidateMigrationCache();
|
|
431
431
|
const endpoint = getContentTypeEndpoint(client.wpApiUrl, job.contentType);
|
|
432
432
|
const rawIncludeIds = job.includeIds || job.configuration?.includeIds;
|