payload-wordpress-migrator 0.0.22
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/LICENSE +21 -0
- package/README.md +586 -0
- package/dist/components/BeforeDashboardClient.d.ts +14 -0
- package/dist/components/BeforeDashboardClient.js +225 -0
- package/dist/components/BeforeDashboardClient.js.map +1 -0
- package/dist/components/BeforeDashboardClient.module.css +175 -0
- package/dist/components/BeforeDashboardServer.d.ts +1 -0
- package/dist/components/BeforeDashboardServer.js +29 -0
- package/dist/components/BeforeDashboardServer.js.map +1 -0
- package/dist/components/ContentTypeSelect.d.ts +4 -0
- package/dist/components/ContentTypeSelect.js +147 -0
- package/dist/components/ContentTypeSelect.js.map +1 -0
- package/dist/components/FieldMappingConfiguration.d.ts +5 -0
- package/dist/components/FieldMappingConfiguration.js +361 -0
- package/dist/components/FieldMappingConfiguration.js.map +1 -0
- package/dist/components/FieldMappingConfiguration.module.css +75 -0
- package/dist/components/MigrationDashboardClient.d.ts +6 -0
- package/dist/components/MigrationDashboardClient.js +49 -0
- package/dist/components/MigrationDashboardClient.js.map +1 -0
- package/dist/components/MigrationDashboardClient.module.css +749 -0
- package/dist/components/SimpleFieldMapping.d.ts +5 -0
- package/dist/components/SimpleFieldMapping.js +437 -0
- package/dist/components/SimpleFieldMapping.js.map +1 -0
- package/dist/components/dashboard/JobActionButtons.d.ts +8 -0
- package/dist/components/dashboard/JobActionButtons.js +91 -0
- package/dist/components/dashboard/JobActionButtons.js.map +1 -0
- package/dist/components/dashboard/JobsTable.d.ts +6 -0
- package/dist/components/dashboard/JobsTable.js +86 -0
- package/dist/components/dashboard/JobsTable.js.map +1 -0
- package/dist/components/dashboard/LogViewer.d.ts +3 -0
- package/dist/components/dashboard/LogViewer.js +35 -0
- package/dist/components/dashboard/LogViewer.js.map +1 -0
- package/dist/components/dashboard/SiteConfigPanel.d.ts +12 -0
- package/dist/components/dashboard/SiteConfigPanel.js +205 -0
- package/dist/components/dashboard/SiteConfigPanel.js.map +1 -0
- package/dist/components/dashboard/StatsOverview.d.ts +5 -0
- package/dist/components/dashboard/StatsOverview.js +72 -0
- package/dist/components/dashboard/StatsOverview.js.map +1 -0
- package/dist/components/dashboard/index.d.ts +7 -0
- package/dist/components/dashboard/index.js +7 -0
- package/dist/components/dashboard/index.js.map +1 -0
- package/dist/components/dashboard/types.d.ts +46 -0
- package/dist/components/dashboard/types.js +2 -0
- package/dist/components/dashboard/types.js.map +1 -0
- package/dist/components/dashboard/useMigrationDashboard.d.ts +15 -0
- package/dist/components/dashboard/useMigrationDashboard.js +584 -0
- package/dist/components/dashboard/useMigrationDashboard.js.map +1 -0
- package/dist/exports/client.d.ts +4 -0
- package/dist/exports/client.js +5 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/rsc.d.ts +1 -0
- package/dist/exports/rsc.js +2 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/index.d.ts +101 -0
- package/dist/index.js +443 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/content/blocks.d.ts +6 -0
- package/dist/utils/content/blocks.js +93 -0
- package/dist/utils/content/blocks.js.map +1 -0
- package/dist/utils/content/fieldMapping.d.ts +9 -0
- package/dist/utils/content/fieldMapping.js +218 -0
- package/dist/utils/content/fieldMapping.js.map +1 -0
- package/dist/utils/content/index.d.ts +4 -0
- package/dist/utils/content/index.js +4 -0
- package/dist/utils/content/index.js.map +1 -0
- package/dist/utils/content/transformer.d.ts +5 -0
- package/dist/utils/content/transformer.js +323 -0
- package/dist/utils/content/transformer.js.map +1 -0
- package/dist/utils/endpoints/handlers.d.ts +9 -0
- package/dist/utils/endpoints/handlers.js +201 -0
- package/dist/utils/endpoints/handlers.js.map +1 -0
- package/dist/utils/endpoints/index.d.ts +2 -0
- package/dist/utils/endpoints/index.js +2 -0
- package/dist/utils/endpoints/index.js.map +1 -0
- package/dist/utils/fields/analyzer.d.ts +7 -0
- package/dist/utils/fields/analyzer.js +502 -0
- package/dist/utils/fields/analyzer.js.map +1 -0
- package/dist/utils/fields/index.d.ts +2 -0
- package/dist/utils/fields/index.js +2 -0
- package/dist/utils/fields/index.js.map +1 -0
- package/dist/utils/helpers/auth.d.ts +9 -0
- package/dist/utils/helpers/auth.js +50 -0
- package/dist/utils/helpers/auth.js.map +1 -0
- package/dist/utils/helpers/cache.d.ts +11 -0
- package/dist/utils/helpers/cache.js +47 -0
- package/dist/utils/helpers/cache.js.map +1 -0
- package/dist/utils/helpers/concurrency.d.ts +2 -0
- package/dist/utils/helpers/concurrency.js +26 -0
- package/dist/utils/helpers/concurrency.js.map +1 -0
- package/dist/utils/helpers/index.d.ts +8 -0
- package/dist/utils/helpers/index.js +8 -0
- package/dist/utils/helpers/index.js.map +1 -0
- package/dist/utils/helpers/objectHelpers.d.ts +3 -0
- package/dist/utils/helpers/objectHelpers.js +22 -0
- package/dist/utils/helpers/objectHelpers.js.map +1 -0
- package/dist/utils/helpers/rateLimiter.d.ts +10 -0
- package/dist/utils/helpers/rateLimiter.js +29 -0
- package/dist/utils/helpers/rateLimiter.js.map +1 -0
- package/dist/utils/helpers/responses.d.ts +3 -0
- package/dist/utils/helpers/responses.js +23 -0
- package/dist/utils/helpers/responses.js.map +1 -0
- package/dist/utils/helpers/wpHelpers.d.ts +6 -0
- package/dist/utils/helpers/wpHelpers.js +29 -0
- package/dist/utils/helpers/wpHelpers.js.map +1 -0
- package/dist/utils/lexical/constants.d.ts +37 -0
- package/dist/utils/lexical/constants.js +58 -0
- package/dist/utils/lexical/constants.js.map +1 -0
- package/dist/utils/lexical/htmlParser.d.ts +20 -0
- package/dist/utils/lexical/htmlParser.js +253 -0
- package/dist/utils/lexical/htmlParser.js.map +1 -0
- package/dist/utils/lexical/htmlToLexicalConverter.d.ts +55 -0
- package/dist/utils/lexical/htmlToLexicalConverter.js +999 -0
- package/dist/utils/lexical/htmlToLexicalConverter.js.map +1 -0
- package/dist/utils/lexical/index.d.ts +5 -0
- package/dist/utils/lexical/index.js +4 -0
- package/dist/utils/lexical/index.js.map +1 -0
- package/dist/utils/lexical/nodeFactories.d.ts +21 -0
- package/dist/utils/lexical/nodeFactories.js +91 -0
- package/dist/utils/lexical/nodeFactories.js.map +1 -0
- package/dist/utils/lexical/preprocessor.d.ts +4 -0
- package/dist/utils/lexical/preprocessor.js +302 -0
- package/dist/utils/lexical/preprocessor.js.map +1 -0
- package/dist/utils/media/download.d.ts +7 -0
- package/dist/utils/media/download.js +85 -0
- package/dist/utils/media/download.js.map +1 -0
- package/dist/utils/media/extraction.d.ts +12 -0
- package/dist/utils/media/extraction.js +58 -0
- package/dist/utils/media/extraction.js.map +1 -0
- package/dist/utils/media/import.d.ts +7 -0
- package/dist/utils/media/import.js +146 -0
- package/dist/utils/media/import.js.map +1 -0
- package/dist/utils/media/index.d.ts +6 -0
- package/dist/utils/media/index.js +6 -0
- package/dist/utils/media/index.js.map +1 -0
- package/dist/utils/media/upload.d.ts +4 -0
- package/dist/utils/media/upload.js +46 -0
- package/dist/utils/media/upload.js.map +1 -0
- package/dist/utils/media/validation.d.ts +8 -0
- package/dist/utils/media/validation.js +60 -0
- package/dist/utils/media/validation.js.map +1 -0
- package/dist/utils/migration/index.d.ts +3 -0
- package/dist/utils/migration/index.js +3 -0
- package/dist/utils/migration/index.js.map +1 -0
- package/dist/utils/migration/jobCrud.d.ts +4 -0
- package/dist/utils/migration/jobCrud.js +380 -0
- package/dist/utils/migration/jobCrud.js.map +1 -0
- package/dist/utils/migration/orchestrator.d.ts +5 -0
- package/dist/utils/migration/orchestrator.js +756 -0
- package/dist/utils/migration/orchestrator.js.map +1 -0
- package/dist/utils/types.d.ts +201 -0
- package/dist/utils/types.js +14 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/wordpress/client.d.ts +61 -0
- package/dist/utils/wordpress/client.js +365 -0
- package/dist/utils/wordpress/client.js.map +1 -0
- package/dist/utils/wordpress/index.d.ts +2 -0
- package/dist/utils/wordpress/index.js +2 -0
- package/dist/utils/wordpress/index.js.map +1 -0
- package/dist/utils/wordpressApi.d.ts +11 -0
- package/dist/utils/wordpressApi.js +25 -0
- package/dist/utils/wordpressApi.js.map +1 -0
- package/package.json +155 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** CRUD operations and status management for WordPress migration jobs. */
|
|
2
|
+
import type { PayloadRequest } from 'payload';
|
|
3
|
+
import type { PayloadWordPressMigratorConfig } from '../../index.js';
|
|
4
|
+
export declare const migrationJobHandler: (req: PayloadRequest, pluginOptions: PayloadWordPressMigratorConfig) => Promise<Response>;
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import { MIGRATION_COLLECTION } from '../types.js';
|
|
2
|
+
import { processMigrationJob } from './orchestrator.js';
|
|
3
|
+
import { requireMigrationAccess, parseRequestBody } from '../helpers/auth.js';
|
|
4
|
+
import { createErrorResponse, createSuccessResponse } from '../helpers/responses.js';
|
|
5
|
+
import { invalidateMigrationCache } from '../helpers/cache.js';
|
|
6
|
+
|
|
7
|
+
const migrationJobHandler = async (req, pluginOptions)=>{
|
|
8
|
+
const authError = await requireMigrationAccess(req, pluginOptions.access);
|
|
9
|
+
if (authError) return authError;
|
|
10
|
+
const { method } = req;
|
|
11
|
+
const { action, jobId } = req.query || {};
|
|
12
|
+
try {
|
|
13
|
+
switch(method){
|
|
14
|
+
case 'DELETE':
|
|
15
|
+
if (!jobId) {
|
|
16
|
+
return createErrorResponse('jobId is required for DELETE requests');
|
|
17
|
+
}
|
|
18
|
+
return await deleteMigrationJob(jobId, req);
|
|
19
|
+
case 'GET':
|
|
20
|
+
if (!jobId) {
|
|
21
|
+
return createErrorResponse('jobId is required for GET requests');
|
|
22
|
+
}
|
|
23
|
+
return await getMigrationJobStatus(jobId, req);
|
|
24
|
+
case 'POST':
|
|
25
|
+
return await startMigrationJob(req, pluginOptions);
|
|
26
|
+
case 'PUT':
|
|
27
|
+
if (!jobId || !action) {
|
|
28
|
+
return createErrorResponse('jobId and action are required for PUT requests');
|
|
29
|
+
}
|
|
30
|
+
return await updateMigrationJob(jobId, action, req);
|
|
31
|
+
default:
|
|
32
|
+
return new Response('Method not allowed', {
|
|
33
|
+
status: 405
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const startMigrationJob = async (req, pluginOptions)=>{
|
|
41
|
+
try {
|
|
42
|
+
const body = await parseRequestBody(req);
|
|
43
|
+
const { action, jobId, siteConfig } = body;
|
|
44
|
+
if (!jobId) {
|
|
45
|
+
return createErrorResponse('jobId is required');
|
|
46
|
+
}
|
|
47
|
+
if (!siteConfig || !siteConfig.wpSiteUrl || !siteConfig.wpUsername || !siteConfig.wpPassword) {
|
|
48
|
+
return createErrorResponse('WordPress site configuration is required. Please configure your WordPress site in the dashboard first.');
|
|
49
|
+
}
|
|
50
|
+
const job = await req.payload.findByID({
|
|
51
|
+
id: jobId,
|
|
52
|
+
collection: MIGRATION_COLLECTION
|
|
53
|
+
});
|
|
54
|
+
if (!job) {
|
|
55
|
+
return createErrorResponse('Migration job not found', 404);
|
|
56
|
+
}
|
|
57
|
+
// Rollback is a distinct action — delegate and return early
|
|
58
|
+
if (action === 'rollback') {
|
|
59
|
+
return await rollbackMigrationJob(jobId, req);
|
|
60
|
+
}
|
|
61
|
+
// Prevent concurrent jobs on the same target collection
|
|
62
|
+
const runningJobs = await req.payload.find({
|
|
63
|
+
collection: MIGRATION_COLLECTION,
|
|
64
|
+
limit: 1,
|
|
65
|
+
where: {
|
|
66
|
+
id: {
|
|
67
|
+
not_equals: jobId
|
|
68
|
+
},
|
|
69
|
+
status: {
|
|
70
|
+
equals: 'running'
|
|
71
|
+
},
|
|
72
|
+
targetCollection: {
|
|
73
|
+
equals: job.targetCollection
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
if (runningJobs.totalDocs > 0) {
|
|
78
|
+
return createErrorResponse(`Another migration job ("${runningJobs.docs[0].jobName}") is already running on the "${job.targetCollection}" collection. Wait for it to complete or pause it first.`, 409);
|
|
79
|
+
}
|
|
80
|
+
const updateData = {
|
|
81
|
+
status: 'running'
|
|
82
|
+
};
|
|
83
|
+
if (action === 'retry') {
|
|
84
|
+
updateData.progress = {
|
|
85
|
+
failedItems: 0,
|
|
86
|
+
processedItems: 0,
|
|
87
|
+
successfulItems: 0,
|
|
88
|
+
totalItems: 0
|
|
89
|
+
};
|
|
90
|
+
updateData.startTime = new Date();
|
|
91
|
+
updateData.logs = [
|
|
92
|
+
...job.logs || [],
|
|
93
|
+
{
|
|
94
|
+
level: 'info',
|
|
95
|
+
message: `Retrying migration job for ${job.contentType}`,
|
|
96
|
+
timestamp: new Date()
|
|
97
|
+
}
|
|
98
|
+
];
|
|
99
|
+
} else if (action === 'restart') {
|
|
100
|
+
updateData.progress = {
|
|
101
|
+
failedItems: 0,
|
|
102
|
+
processedItems: 0,
|
|
103
|
+
successfulItems: 0,
|
|
104
|
+
totalItems: 0
|
|
105
|
+
};
|
|
106
|
+
updateData.startTime = new Date();
|
|
107
|
+
updateData.endTime = null;
|
|
108
|
+
updateData.logs = [
|
|
109
|
+
...job.logs || [],
|
|
110
|
+
{
|
|
111
|
+
level: 'info',
|
|
112
|
+
message: `Restarting completed migration job for ${job.contentType}`,
|
|
113
|
+
timestamp: new Date()
|
|
114
|
+
}
|
|
115
|
+
];
|
|
116
|
+
} else if (action === 'resume') {
|
|
117
|
+
updateData.logs = [
|
|
118
|
+
...job.logs || [],
|
|
119
|
+
{
|
|
120
|
+
level: 'info',
|
|
121
|
+
message: `Resuming migration job for ${job.contentType}`,
|
|
122
|
+
timestamp: new Date()
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
} else if (action === 'update') {
|
|
126
|
+
updateData.progress = {
|
|
127
|
+
failedItems: 0,
|
|
128
|
+
processedItems: 0,
|
|
129
|
+
successfulItems: 0,
|
|
130
|
+
totalItems: 0
|
|
131
|
+
};
|
|
132
|
+
updateData.startTime = new Date();
|
|
133
|
+
updateData.logs = [
|
|
134
|
+
...job.logs || [],
|
|
135
|
+
{
|
|
136
|
+
level: 'info',
|
|
137
|
+
message: `Starting selective update for existing ${job.contentType} posts (missing fields only)`,
|
|
138
|
+
timestamp: new Date()
|
|
139
|
+
}
|
|
140
|
+
];
|
|
141
|
+
} else {
|
|
142
|
+
updateData.progress = {
|
|
143
|
+
failedItems: 0,
|
|
144
|
+
processedItems: 0,
|
|
145
|
+
successfulItems: 0,
|
|
146
|
+
totalItems: 0
|
|
147
|
+
};
|
|
148
|
+
updateData.startTime = new Date();
|
|
149
|
+
}
|
|
150
|
+
await req.payload.update({
|
|
151
|
+
id: jobId,
|
|
152
|
+
collection: MIGRATION_COLLECTION,
|
|
153
|
+
data: updateData
|
|
154
|
+
});
|
|
155
|
+
invalidateMigrationCache();
|
|
156
|
+
void processMigrationJob(jobId, job, req.payload, pluginOptions, siteConfig, action).catch(async (error)=>{
|
|
157
|
+
req.payload.logger.error(`Migration job ${jobId} failed: ${error}`);
|
|
158
|
+
try {
|
|
159
|
+
const freshJob = await req.payload.findByID({
|
|
160
|
+
id: jobId,
|
|
161
|
+
collection: MIGRATION_COLLECTION
|
|
162
|
+
});
|
|
163
|
+
await req.payload.update({
|
|
164
|
+
id: jobId,
|
|
165
|
+
collection: MIGRATION_COLLECTION,
|
|
166
|
+
data: {
|
|
167
|
+
logs: [
|
|
168
|
+
...freshJob?.logs || [],
|
|
169
|
+
{
|
|
170
|
+
level: 'error',
|
|
171
|
+
message: `Migration failed: ${error.message}`,
|
|
172
|
+
timestamp: new Date()
|
|
173
|
+
}
|
|
174
|
+
],
|
|
175
|
+
status: 'failed'
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
} catch (updateError) {
|
|
179
|
+
req.payload.logger.error(`Failed to update job ${jobId} status: ${updateError}`);
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
const result = {
|
|
183
|
+
jobId,
|
|
184
|
+
message: action === 'retry' ? `Migration job ${jobId} retry started successfully` : action === 'resume' ? `Migration job ${jobId} resumed successfully` : `Migration job ${jobId} started successfully`,
|
|
185
|
+
status: 'running',
|
|
186
|
+
success: true
|
|
187
|
+
};
|
|
188
|
+
return createSuccessResponse(result);
|
|
189
|
+
} catch (error) {
|
|
190
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
const updateMigrationJob = async (jobId, action, req)=>{
|
|
194
|
+
try {
|
|
195
|
+
let newStatus = 'unknown';
|
|
196
|
+
if (action === 'pause') {
|
|
197
|
+
newStatus = 'paused';
|
|
198
|
+
} else if (action === 'resume') {
|
|
199
|
+
newStatus = 'running';
|
|
200
|
+
}
|
|
201
|
+
const currentJob = await req.payload.findByID({
|
|
202
|
+
id: jobId,
|
|
203
|
+
collection: MIGRATION_COLLECTION
|
|
204
|
+
});
|
|
205
|
+
const updateData = {
|
|
206
|
+
lastUpdate: new Date(),
|
|
207
|
+
status: newStatus
|
|
208
|
+
};
|
|
209
|
+
if (action === 'pause') {
|
|
210
|
+
const progress = currentJob.progress || {
|
|
211
|
+
processedItems: 0,
|
|
212
|
+
totalItems: 0
|
|
213
|
+
};
|
|
214
|
+
updateData.logs = [
|
|
215
|
+
...currentJob.logs || [],
|
|
216
|
+
{
|
|
217
|
+
level: 'info',
|
|
218
|
+
message: `Migration paused by user at ${progress.processedItems}/${progress.totalItems} items`,
|
|
219
|
+
timestamp: new Date()
|
|
220
|
+
}
|
|
221
|
+
];
|
|
222
|
+
} else if (action === 'resume') {
|
|
223
|
+
updateData.logs = [
|
|
224
|
+
...currentJob.logs || [],
|
|
225
|
+
{
|
|
226
|
+
level: 'info',
|
|
227
|
+
message: `Migration resume requested by user`,
|
|
228
|
+
timestamp: new Date()
|
|
229
|
+
}
|
|
230
|
+
];
|
|
231
|
+
}
|
|
232
|
+
await req.payload.update({
|
|
233
|
+
id: jobId,
|
|
234
|
+
collection: MIGRATION_COLLECTION,
|
|
235
|
+
data: updateData
|
|
236
|
+
});
|
|
237
|
+
invalidateMigrationCache();
|
|
238
|
+
const result = {
|
|
239
|
+
action,
|
|
240
|
+
jobId,
|
|
241
|
+
message: `Migration job ${jobId} ${action}d successfully`,
|
|
242
|
+
status: newStatus,
|
|
243
|
+
success: true
|
|
244
|
+
};
|
|
245
|
+
return createSuccessResponse(result);
|
|
246
|
+
} catch (error) {
|
|
247
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
248
|
+
}
|
|
249
|
+
};
|
|
250
|
+
const getMigrationJobStatus = async (jobId, req)=>{
|
|
251
|
+
try {
|
|
252
|
+
const job = await req.payload.findByID({
|
|
253
|
+
id: jobId,
|
|
254
|
+
collection: MIGRATION_COLLECTION
|
|
255
|
+
});
|
|
256
|
+
if (!job) {
|
|
257
|
+
return createErrorResponse('Migration job not found', 404);
|
|
258
|
+
}
|
|
259
|
+
const result = {
|
|
260
|
+
id: job.id,
|
|
261
|
+
lastUpdate: job.updatedAt,
|
|
262
|
+
progress: job.progress || {
|
|
263
|
+
failedItems: 0,
|
|
264
|
+
processedItems: 0,
|
|
265
|
+
successfulItems: 0,
|
|
266
|
+
totalItems: 0
|
|
267
|
+
},
|
|
268
|
+
startTime: job.startTime || job.createdAt,
|
|
269
|
+
status: job.status
|
|
270
|
+
};
|
|
271
|
+
return createSuccessResponse(result);
|
|
272
|
+
} catch (error) {
|
|
273
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
const deleteMigrationJob = async (jobId, req)=>{
|
|
277
|
+
try {
|
|
278
|
+
const job = await req.payload.findByID({
|
|
279
|
+
id: jobId,
|
|
280
|
+
collection: MIGRATION_COLLECTION
|
|
281
|
+
}).catch((error)=>{
|
|
282
|
+
if (error?.status === 404 || error?.message?.includes('not found')) return null;
|
|
283
|
+
throw error;
|
|
284
|
+
});
|
|
285
|
+
if (!job) {
|
|
286
|
+
return createErrorResponse('Migration job not found', 404);
|
|
287
|
+
}
|
|
288
|
+
if (job.status === 'running') {
|
|
289
|
+
return createErrorResponse('Cannot delete a running migration job. Please pause it first.');
|
|
290
|
+
}
|
|
291
|
+
await req.payload.delete({
|
|
292
|
+
id: jobId,
|
|
293
|
+
collection: MIGRATION_COLLECTION
|
|
294
|
+
});
|
|
295
|
+
invalidateMigrationCache();
|
|
296
|
+
const result = {
|
|
297
|
+
jobId,
|
|
298
|
+
message: `Migration job ${jobId} deleted successfully`,
|
|
299
|
+
success: true
|
|
300
|
+
};
|
|
301
|
+
return createSuccessResponse(result);
|
|
302
|
+
} catch (error) {
|
|
303
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
const rollbackMigrationJob = async (jobId, req)=>{
|
|
307
|
+
try {
|
|
308
|
+
const job = await req.payload.findByID({
|
|
309
|
+
id: jobId,
|
|
310
|
+
collection: MIGRATION_COLLECTION
|
|
311
|
+
});
|
|
312
|
+
if (!job) {
|
|
313
|
+
return createErrorResponse('Migration job not found', 404);
|
|
314
|
+
}
|
|
315
|
+
if (job.status === 'running') {
|
|
316
|
+
return createErrorResponse('Cannot rollback a running job. Pause it first.', 400);
|
|
317
|
+
}
|
|
318
|
+
// Find all items created by this job via migration metadata
|
|
319
|
+
const countResult = await req.payload.find({
|
|
320
|
+
collection: job.targetCollection,
|
|
321
|
+
limit: 0,
|
|
322
|
+
where: {
|
|
323
|
+
'migratedFromWordPress.wpPostType': {
|
|
324
|
+
equals: job.contentType
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
if (countResult.totalDocs === 0) {
|
|
329
|
+
return createSuccessResponse({
|
|
330
|
+
deleted: 0,
|
|
331
|
+
message: 'No migrated items found to rollback'
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
// Paginated delete — fetch and delete in pages to avoid loading all items into memory
|
|
335
|
+
let deleted = 0;
|
|
336
|
+
let hasMore = true;
|
|
337
|
+
while(hasMore){
|
|
338
|
+
const items = await req.payload.find({
|
|
339
|
+
collection: job.targetCollection,
|
|
340
|
+
limit: 100,
|
|
341
|
+
page: 1,
|
|
342
|
+
where: {
|
|
343
|
+
'migratedFromWordPress.wpPostType': {
|
|
344
|
+
equals: job.contentType
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
});
|
|
348
|
+
if (items.docs.length === 0) break;
|
|
349
|
+
for (const item of items.docs){
|
|
350
|
+
try {
|
|
351
|
+
await req.payload.delete({
|
|
352
|
+
collection: job.targetCollection,
|
|
353
|
+
id: item.id
|
|
354
|
+
});
|
|
355
|
+
deleted++;
|
|
356
|
+
} catch {
|
|
357
|
+
// Partial rollback is better than none — continue on individual failures
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
hasMore = items.totalDocs > items.docs.length;
|
|
361
|
+
}
|
|
362
|
+
await req.payload.update({
|
|
363
|
+
id: jobId,
|
|
364
|
+
collection: MIGRATION_COLLECTION,
|
|
365
|
+
data: {
|
|
366
|
+
status: 'rolled_back'
|
|
367
|
+
}
|
|
368
|
+
});
|
|
369
|
+
invalidateMigrationCache();
|
|
370
|
+
return createSuccessResponse({
|
|
371
|
+
deleted,
|
|
372
|
+
message: `Rolled back ${deleted} items`
|
|
373
|
+
});
|
|
374
|
+
} catch (error) {
|
|
375
|
+
return createErrorResponse(error instanceof Error ? error : new Error(String(error)), 500);
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
|
|
379
|
+
export { migrationJobHandler };
|
|
380
|
+
//# sourceMappingURL=jobCrud.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Core migration orchestration: fetch WordPress content in batches, transform, deduplicate, and create in PayloadCMS. */
|
|
2
|
+
import type { Payload } from 'payload';
|
|
3
|
+
import type { PayloadWordPressMigratorConfig } from '../../index.js';
|
|
4
|
+
import type { MigrationJob, SiteConfig } from '../types.js';
|
|
5
|
+
export declare const processMigrationJob: (jobId: string, job: MigrationJob, payload: Payload, pluginOptions: PayloadWordPressMigratorConfig, siteConfig: SiteConfig, action?: string) => Promise<void>;
|