@webiny/api-page-builder-import-export 0.0.0-unstable.990c3ab1b6 → 0.0.0-unstable.d4f203fa97
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/client.js +6 -2
- package/client.js.map +1 -1
- package/exportPages/combine/index.js +19 -11
- package/exportPages/combine/index.js.map +1 -1
- package/exportPages/process/index.js +35 -19
- package/exportPages/process/index.js.map +1 -1
- package/exportPages/s3Stream.js +20 -1
- package/exportPages/s3Stream.js.map +1 -1
- package/exportPages/utils.js +31 -18
- package/exportPages/utils.js.map +1 -1
- package/exportPages/zipper.js +41 -29
- package/exportPages/zipper.js.map +1 -1
- package/graphql/crud/pageImportExportTasks.crud.js +57 -9
- package/graphql/crud/pageImportExportTasks.crud.js.map +1 -1
- package/graphql/crud/pages.crud.js +39 -21
- package/graphql/crud/pages.crud.js.map +1 -1
- package/graphql/crud.js +5 -0
- package/graphql/crud.js.map +1 -1
- package/graphql/graphql/pageImportExportTasks.gql.js +6 -1
- package/graphql/graphql/pageImportExportTasks.gql.js.map +1 -1
- package/graphql/graphql/pages.gql.js +6 -1
- package/graphql/graphql/pages.gql.js.map +1 -1
- package/graphql/graphql/utils/resolve.js +3 -0
- package/graphql/graphql/utils/resolve.js.map +1 -1
- package/graphql/graphql.js +4 -0
- package/graphql/graphql.js.map +1 -1
- package/graphql/index.js +5 -0
- package/graphql/index.js.map +1 -1
- package/importPages/create/index.js +20 -9
- package/importPages/create/index.js.map +1 -1
- package/importPages/process/index.js +29 -24
- package/importPages/process/index.js.map +1 -1
- package/importPages/utils.js +126 -44
- package/importPages/utils.js.map +1 -1
- package/mockSecurity.js +2 -0
- package/mockSecurity.js.map +1 -1
- package/package.json +23 -23
- package/types.js +5 -0
- package/types.js.map +1 -1
@@ -4,12 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
+
|
7
8
|
var _types = require("../../types");
|
9
|
+
|
8
10
|
var _utils = require("../utils");
|
11
|
+
|
9
12
|
var _client = require("../../client");
|
13
|
+
|
10
14
|
var _mockSecurity = require("../../mockSecurity");
|
15
|
+
|
11
16
|
var _utils2 = require("@webiny/utils");
|
17
|
+
|
12
18
|
var _handlerAws = require("@webiny/handler-aws");
|
19
|
+
|
13
20
|
/**
|
14
21
|
* Handles the import page workflow.
|
15
22
|
*/
|
@@ -28,8 +35,10 @@ var _default = configuration => {
|
|
28
35
|
zipFileUrl,
|
29
36
|
identity
|
30
37
|
} = payload;
|
38
|
+
|
31
39
|
try {
|
32
40
|
log("RUNNING Import Pages Create");
|
41
|
+
|
33
42
|
if (!zipFileUrl) {
|
34
43
|
return {
|
35
44
|
data: null,
|
@@ -38,14 +47,14 @@ var _default = configuration => {
|
|
38
47
|
}
|
39
48
|
};
|
40
49
|
}
|
41
|
-
(0, _mockSecurity.mockSecurity)(identity, context);
|
42
|
-
// Step 1: Read the zip file
|
43
|
-
const pageImportDataList = await (0, _utils.readExtractAndUploadZipFileContents)(zipFileUrl);
|
44
50
|
|
45
|
-
|
51
|
+
(0, _mockSecurity.mockSecurity)(identity, context); // Step 1: Read the zip file
|
52
|
+
|
53
|
+
const pageImportDataList = await (0, _utils.readExtractAndUploadZipFileContents)(zipFileUrl); // For each page create a subtask and invoke the process handler
|
54
|
+
|
46
55
|
for (let i = 0; i < pageImportDataList.length; i++) {
|
47
|
-
const pagesDirMap = pageImportDataList[i];
|
48
|
-
|
56
|
+
const pagesDirMap = pageImportDataList[i]; // Create sub task
|
57
|
+
|
49
58
|
const subtask = await pageBuilder.pageImportExportTask.createSubTask(task.id, (0, _utils2.zeroPad)(i + 1, 5), {
|
50
59
|
status: _types.PageImportExportTaskStatus.PENDING,
|
51
60
|
data: {
|
@@ -58,8 +67,9 @@ var _default = configuration => {
|
|
58
67
|
}
|
59
68
|
});
|
60
69
|
log(`Added SUB_TASK "${subtask.id}" to queue.`);
|
61
|
-
}
|
62
|
-
|
70
|
+
} // Update main task status
|
71
|
+
|
72
|
+
|
63
73
|
await pageBuilder.pageImportExportTask.updateTask(task.id, {
|
64
74
|
status: _types.PageImportExportTaskStatus.PROCESSING,
|
65
75
|
stats: (0, _utils.initialStats)(pageImportDataList.length)
|
@@ -77,7 +87,6 @@ var _default = configuration => {
|
|
77
87
|
});
|
78
88
|
} catch (e) {
|
79
89
|
log("[IMPORT_PAGES_CREATE] Error => ", e);
|
80
|
-
|
81
90
|
/**
|
82
91
|
* In case of error, we'll update the task status to "failed",
|
83
92
|
* so that, client can show notify the user appropriately.
|
@@ -98,10 +107,12 @@ var _default = configuration => {
|
|
98
107
|
}
|
99
108
|
};
|
100
109
|
}
|
110
|
+
|
101
111
|
return {
|
102
112
|
data: "",
|
103
113
|
error: null
|
104
114
|
};
|
105
115
|
});
|
106
116
|
};
|
117
|
+
|
107
118
|
exports.default = _default;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["configuration","createRawEventHandler","payload","context","log","console","pageBuilder","task","category","zipFileUrl","identity","data","error","message","mockSecurity","pageImportDataList","readExtractAndUploadZipFileContents","i","length","pagesDirMap","subtask","pageImportExportTask","createSubTask","id","zeroPad","status","PageImportExportTaskStatus","PENDING","pageKey","key","input","fileUploadsData","updateTask","PROCESSING","stats","initialStats","invokeHandlerClient","name","handlers","process","taskId","subTaskIndex","security","getIdentity","description","e","FAILED","code"],"sources":["index.ts"],"sourcesContent":["import {\n PageImportExportTask,\n PageImportExportTaskStatus,\n PbPageImportExportContext\n} from \"~/types\";\nimport { initialStats, readExtractAndUploadZipFileContents } from \"~/importPages/utils\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { Payload as ProcessPayload } from \"../process\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\ninterface Configuration {\n handlers: {\n process: string;\n };\n}\n\nexport interface Payload {\n category: string;\n zipFileUrl: string;\n task: PageImportExportTask;\n identity: SecurityIdentity;\n}\nexport interface Response {\n data: string | null;\n error: Partial<Error> | null;\n}\n\n/**\n * Handles the import page workflow.\n */\nexport default (configuration: Configuration) => {\n return createRawEventHandler<Payload, PbPageImportExportContext, Response>(\n async ({ payload, context }) => {\n const log = console.log;\n\n const { pageBuilder } = context;\n const { task, category, zipFileUrl, identity } = payload;\n try {\n log(\"RUNNING Import Pages Create\");\n if (!zipFileUrl) {\n return {\n data: null,\n error: {\n message: `Missing \"zipFileUrl\"!`\n }\n };\n }\n mockSecurity(identity, context);\n // Step 1: Read the zip file\n const pageImportDataList = await readExtractAndUploadZipFileContents(zipFileUrl);\n\n // For each page create a subtask and invoke the process handler\n for (let i = 0; i < pageImportDataList.length; i++) {\n const pagesDirMap = pageImportDataList[i];\n // Create sub task\n const subtask = await pageBuilder.pageImportExportTask.createSubTask(\n task.id,\n zeroPad(i + 1, 5),\n {\n status: PageImportExportTaskStatus.PENDING,\n data: {\n pageKey: pagesDirMap.key,\n category,\n zipFileUrl,\n input: {\n fileUploadsData: pagesDirMap\n }\n }\n }\n );\n log(`Added SUB_TASK \"${subtask.id}\" to queue.`);\n }\n // Update main task status\n await pageBuilder.pageImportExportTask.updateTask(task.id, {\n status: PageImportExportTaskStatus.PROCESSING,\n stats: initialStats(pageImportDataList.length)\n });\n\n await invokeHandlerClient<ProcessPayload>({\n context,\n name: configuration.handlers.process,\n payload: {\n taskId: task.id,\n // Execute \"Process\" for the first sub task.\n subTaskIndex: 1,\n identity: context.security.getIdentity()\n },\n description: \"Import pages - process - first\"\n });\n } catch (e) {\n log(\"[IMPORT_PAGES_CREATE] Error => \", e);\n\n /**\n * In case of error, we'll update the task status to \"failed\",\n * so that, client can show notify the user appropriately.\n */\n\n await pageBuilder.pageImportExportTask.updateTask(task.id, {\n status: PageImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n code: e.code || \"EXPORT_FAILED\"\n }\n });\n\n return {\n data: null,\n error: {\n message: e.message\n }\n };\n }\n\n return {\n data: \"\",\n error: null\n };\n }\n );\n};\n"],"mappings":"
|
1
|
+
{"version":3,"names":["configuration","createRawEventHandler","payload","context","log","console","pageBuilder","task","category","zipFileUrl","identity","data","error","message","mockSecurity","pageImportDataList","readExtractAndUploadZipFileContents","i","length","pagesDirMap","subtask","pageImportExportTask","createSubTask","id","zeroPad","status","PageImportExportTaskStatus","PENDING","pageKey","key","input","fileUploadsData","updateTask","PROCESSING","stats","initialStats","invokeHandlerClient","name","handlers","process","taskId","subTaskIndex","security","getIdentity","description","e","FAILED","code"],"sources":["index.ts"],"sourcesContent":["import {\n PageImportExportTask,\n PageImportExportTaskStatus,\n PbPageImportExportContext\n} from \"~/types\";\nimport { initialStats, readExtractAndUploadZipFileContents } from \"~/importPages/utils\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { Payload as ProcessPayload } from \"../process\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\ninterface Configuration {\n handlers: {\n process: string;\n };\n}\n\nexport interface Payload {\n category: string;\n zipFileUrl: string;\n task: PageImportExportTask;\n identity: SecurityIdentity;\n}\nexport interface Response {\n data: string | null;\n error: Partial<Error> | null;\n}\n\n/**\n * Handles the import page workflow.\n */\nexport default (configuration: Configuration) => {\n return createRawEventHandler<Payload, PbPageImportExportContext, Response>(\n async ({ payload, context }) => {\n const log = console.log;\n\n const { pageBuilder } = context;\n const { task, category, zipFileUrl, identity } = payload;\n try {\n log(\"RUNNING Import Pages Create\");\n if (!zipFileUrl) {\n return {\n data: null,\n error: {\n message: `Missing \"zipFileUrl\"!`\n }\n };\n }\n mockSecurity(identity, context);\n // Step 1: Read the zip file\n const pageImportDataList = await readExtractAndUploadZipFileContents(zipFileUrl);\n\n // For each page create a subtask and invoke the process handler\n for (let i = 0; i < pageImportDataList.length; i++) {\n const pagesDirMap = pageImportDataList[i];\n // Create sub task\n const subtask = await pageBuilder.pageImportExportTask.createSubTask(\n task.id,\n zeroPad(i + 1, 5),\n {\n status: PageImportExportTaskStatus.PENDING,\n data: {\n pageKey: pagesDirMap.key,\n category,\n zipFileUrl,\n input: {\n fileUploadsData: pagesDirMap\n }\n }\n }\n );\n log(`Added SUB_TASK \"${subtask.id}\" to queue.`);\n }\n // Update main task status\n await pageBuilder.pageImportExportTask.updateTask(task.id, {\n status: PageImportExportTaskStatus.PROCESSING,\n stats: initialStats(pageImportDataList.length)\n });\n\n await invokeHandlerClient<ProcessPayload>({\n context,\n name: configuration.handlers.process,\n payload: {\n taskId: task.id,\n // Execute \"Process\" for the first sub task.\n subTaskIndex: 1,\n identity: context.security.getIdentity()\n },\n description: \"Import pages - process - first\"\n });\n } catch (e) {\n log(\"[IMPORT_PAGES_CREATE] Error => \", e);\n\n /**\n * In case of error, we'll update the task status to \"failed\",\n * so that, client can show notify the user appropriately.\n */\n\n await pageBuilder.pageImportExportTask.updateTask(task.id, {\n status: PageImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n code: e.code || \"EXPORT_FAILED\"\n }\n });\n\n return {\n data: null,\n error: {\n message: e.message\n }\n };\n }\n\n return {\n data: \"\",\n error: null\n };\n }\n );\n};\n"],"mappings":"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"}
|
@@ -4,12 +4,19 @@ Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
5
5
|
});
|
6
6
|
exports.default = void 0;
|
7
|
+
|
7
8
|
var _types = require("../../types");
|
9
|
+
|
8
10
|
var _utils = require("../utils");
|
11
|
+
|
9
12
|
var _client = require("../../client");
|
13
|
+
|
10
14
|
var _mockSecurity = require("../../mockSecurity");
|
15
|
+
|
11
16
|
var _utils2 = require("@webiny/utils");
|
17
|
+
|
12
18
|
var _handlerAws = require("@webiny/handler-aws");
|
19
|
+
|
13
20
|
var _default = configuration => {
|
14
21
|
return (0, _handlerAws.createRawEventHandler)(async ({
|
15
22
|
payload,
|
@@ -27,22 +34,22 @@ var _default = configuration => {
|
|
27
34
|
taskId,
|
28
35
|
subTaskIndex,
|
29
36
|
identity
|
30
|
-
} = payload;
|
31
|
-
// Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks
|
37
|
+
} = payload; // Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks
|
32
38
|
// and this Lambda is invoked internally, without credentials.
|
39
|
+
|
33
40
|
(0, _mockSecurity.mockSecurity)(identity, context);
|
41
|
+
|
34
42
|
try {
|
35
43
|
/*
|
36
44
|
* Note: We're not going to DB for getting next sub-task to process,
|
37
45
|
* because the data might be out of sync due to GSI eventual consistency.
|
38
46
|
*/
|
39
|
-
|
40
47
|
subTask = await pageBuilder.pageImportExportTask.getSubTask(taskId, (0, _utils2.zeroPad)(subTaskIndex, 5));
|
41
|
-
|
42
48
|
/**
|
43
49
|
* Base condition!!
|
44
50
|
* Bail out early, if task not found or task's status is not "pending".
|
45
51
|
*/
|
52
|
+
|
46
53
|
if (!subTask || subTask.status !== _types.PageImportExportTaskStatus.PENDING) {
|
47
54
|
noPendingTask = true;
|
48
55
|
return {
|
@@ -52,6 +59,7 @@ var _default = configuration => {
|
|
52
59
|
} else {
|
53
60
|
noPendingTask = false;
|
54
61
|
}
|
62
|
+
|
55
63
|
prevStatusOfSubTask = subTask.status;
|
56
64
|
log(`Fetched sub task => ${subTask.id}`);
|
57
65
|
const {
|
@@ -63,41 +71,35 @@ var _default = configuration => {
|
|
63
71
|
const {
|
64
72
|
fileUploadsData
|
65
73
|
} = input;
|
66
|
-
log(`Processing page key "${pageKey}"`);
|
74
|
+
log(`Processing page key "${pageKey}"`); // Mark task status as PROCESSING
|
67
75
|
|
68
|
-
// Mark task status as PROCESSING
|
69
76
|
subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {
|
70
77
|
status: _types.PageImportExportTaskStatus.PROCESSING
|
71
|
-
});
|
72
|
-
|
78
|
+
}); // Update stats in main task
|
79
|
+
|
73
80
|
await pageBuilder.pageImportExportTask.updateStats(taskId, {
|
74
81
|
prevStatus: prevStatusOfSubTask,
|
75
82
|
nextStatus: _types.PageImportExportTaskStatus.PROCESSING
|
76
83
|
});
|
77
|
-
prevStatusOfSubTask = subTask.status;
|
84
|
+
prevStatusOfSubTask = subTask.status; // Real job
|
78
85
|
|
79
|
-
// Real job
|
80
86
|
const page = await (0, _utils.importPage)({
|
81
87
|
context,
|
82
88
|
pageKey,
|
83
89
|
key: zipFileKey,
|
84
90
|
fileUploadsData
|
85
|
-
});
|
91
|
+
}); // Create a page
|
86
92
|
|
87
|
-
//
|
88
|
-
let pbPage = await context.pageBuilder.createPage(category);
|
93
|
+
let pbPage = await context.pageBuilder.createPage(category); // Update page with data
|
89
94
|
|
90
|
-
// Update page with data
|
91
95
|
pbPage = await context.pageBuilder.updatePage(pbPage.id, {
|
92
96
|
content: page.content,
|
93
97
|
title: page.title,
|
94
98
|
path: page.path,
|
95
99
|
settings: page.settings
|
96
|
-
});
|
97
|
-
|
98
|
-
// TODO: Publish page
|
99
|
-
|
100
|
+
}); // TODO: Publish page
|
100
101
|
// Update task record in DB
|
102
|
+
|
101
103
|
subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {
|
102
104
|
status: _types.PageImportExportTaskStatus.COMPLETED,
|
103
105
|
data: {
|
@@ -109,8 +111,8 @@ var _default = configuration => {
|
|
109
111
|
status: pbPage.status
|
110
112
|
}
|
111
113
|
}
|
112
|
-
});
|
113
|
-
|
114
|
+
}); // Update stats in main task
|
115
|
+
|
114
116
|
await pageBuilder.pageImportExportTask.updateStats(taskId, {
|
115
117
|
prevStatus: prevStatusOfSubTask,
|
116
118
|
nextStatus: _types.PageImportExportTaskStatus.COMPLETED
|
@@ -118,6 +120,7 @@ var _default = configuration => {
|
|
118
120
|
prevStatusOfSubTask = subTask.status;
|
119
121
|
} catch (e) {
|
120
122
|
log("[IMPORT_PAGES_PROCESS] Error => ", e);
|
123
|
+
|
121
124
|
if (subTask && subTask.id) {
|
122
125
|
/**
|
123
126
|
* In case of error, we'll update the task status to "failed",
|
@@ -131,15 +134,15 @@ var _default = configuration => {
|
|
131
134
|
stack: e.stack,
|
132
135
|
code: "IMPORT_FAILED"
|
133
136
|
}
|
134
|
-
});
|
137
|
+
}); // Update stats in main task
|
135
138
|
|
136
|
-
// Update stats in main task
|
137
139
|
await pageBuilder.pageImportExportTask.updateStats(taskId, {
|
138
140
|
prevStatus: prevStatusOfSubTask,
|
139
141
|
nextStatus: _types.PageImportExportTaskStatus.FAILED
|
140
142
|
});
|
141
143
|
prevStatusOfSubTask = subTask.status;
|
142
144
|
}
|
145
|
+
|
143
146
|
return {
|
144
147
|
data: null,
|
145
148
|
error: {
|
@@ -157,8 +160,8 @@ var _default = configuration => {
|
|
157
160
|
}
|
158
161
|
});
|
159
162
|
} else {
|
160
|
-
log(`Invoking PROCESS for task "${subTaskIndex + 1}"`);
|
161
|
-
|
163
|
+
log(`Invoking PROCESS for task "${subTaskIndex + 1}"`); // We want to continue with Self invocation no matter if current page error out.
|
164
|
+
|
162
165
|
await (0, _client.invokeHandlerClient)({
|
163
166
|
context,
|
164
167
|
name: configuration.handlers.process,
|
@@ -171,10 +174,12 @@ var _default = configuration => {
|
|
171
174
|
});
|
172
175
|
}
|
173
176
|
}
|
177
|
+
|
174
178
|
return {
|
175
179
|
data: "",
|
176
180
|
error: null
|
177
181
|
};
|
178
182
|
});
|
179
183
|
};
|
184
|
+
|
180
185
|
exports.default = _default;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["configuration","createRawEventHandler","payload","context","log","console","subTask","noPendingTask","prevStatusOfSubTask","PageImportExportTaskStatus","PENDING","pageBuilder","taskId","subTaskIndex","identity","mockSecurity","pageImportExportTask","getSubTask","zeroPad","status","data","error","id","pageKey","category","zipFileKey","input","fileUploadsData","updateSubTask","PROCESSING","updateStats","prevStatus","nextStatus","page","importPage","key","pbPage","createPage","updatePage","content","title","path","settings","COMPLETED","message","version","e","FAILED","name","stack","code","updateTask","invokeHandlerClient","handlers","process","security","getIdentity","description"],"sources":["index.ts"],"sourcesContent":["import { PageImportExportTaskStatus, PbPageImportExportContext } from \"~/types\";\nimport { importPage } from \"~/importPages/utils\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\ninterface Configuration {\n handlers: {\n process: string;\n };\n}\n\nexport interface Payload {\n taskId: string;\n subTaskIndex: number;\n identity: SecurityIdentity;\n}\n\nexport interface Response {\n data: string | null;\n error: Partial<Error> | null;\n}\n\nexport default (configuration: Configuration) => {\n return createRawEventHandler<Payload, PbPageImportExportContext, Response>(\n async ({ payload, context }) => {\n const log = console.log;\n let subTask;\n let noPendingTask = true;\n let prevStatusOfSubTask = PageImportExportTaskStatus.PENDING;\n\n log(\"RUNNING Import Page Queue Process\");\n const { pageBuilder } = context;\n const { taskId, subTaskIndex, identity } = payload;\n // Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks\n // and this Lambda is invoked internally, without credentials.\n mockSecurity(identity, context);\n\n try {\n /*\n * Note: We're not going to DB for getting next sub-task to process,\n * because the data might be out of sync due to GSI eventual consistency.\n */\n\n subTask = await pageBuilder.pageImportExportTask.getSubTask(\n taskId,\n zeroPad(subTaskIndex, 5)\n );\n\n /**\n * Base condition!!\n * Bail out early, if task not found or task's status is not \"pending\".\n */\n if (!subTask || subTask.status !== PageImportExportTaskStatus.PENDING) {\n noPendingTask = true;\n return {\n data: \"\",\n error: null\n };\n } else {\n noPendingTask = false;\n }\n prevStatusOfSubTask = subTask.status;\n\n log(`Fetched sub task => ${subTask.id}`);\n\n const { pageKey, category, zipFileKey, input } = subTask.data;\n const { fileUploadsData } = input;\n\n log(`Processing page key \"${pageKey}\"`);\n\n // Mark task status as PROCESSING\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {\n status: PageImportExportTaskStatus.PROCESSING\n });\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.PROCESSING\n });\n prevStatusOfSubTask = subTask.status;\n\n // Real job\n const page = await importPage({\n context,\n pageKey,\n key: zipFileKey,\n fileUploadsData\n });\n\n // Create a page\n let pbPage = await context.pageBuilder.createPage(category);\n\n // Update page with data\n pbPage = await context.pageBuilder.updatePage(pbPage.id, {\n content: page.content,\n title: page.title,\n path: page.path,\n settings: page.settings\n });\n\n // TODO: Publish page\n\n // Update task record in DB\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {\n status: PageImportExportTaskStatus.COMPLETED,\n data: {\n message: \"Done\",\n page: {\n id: pbPage.id,\n title: pbPage.title,\n version: pbPage.version,\n status: pbPage.status\n }\n }\n });\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.COMPLETED\n });\n prevStatusOfSubTask = subTask.status;\n } catch (e) {\n log(\"[IMPORT_PAGES_PROCESS] Error => \", e);\n\n if (subTask && subTask.id) {\n /**\n * In case of error, we'll update the task status to \"failed\",\n * so that, client can show notify the user appropriately.\n */\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(\n taskId,\n subTask.id,\n {\n status: PageImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n stack: e.stack,\n code: \"IMPORT_FAILED\"\n }\n }\n );\n\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.FAILED\n });\n prevStatusOfSubTask = subTask.status;\n }\n\n return {\n data: null,\n error: {\n message: e.message\n }\n };\n } finally {\n // Base condition!\n if (noPendingTask) {\n log(`No pending sub-task for task ${taskId}`);\n\n await pageBuilder.pageImportExportTask.updateTask(taskId, {\n status: PageImportExportTaskStatus.COMPLETED,\n data: {\n message: `Finish importing pages.`\n }\n });\n } else {\n log(`Invoking PROCESS for task \"${subTaskIndex + 1}\"`);\n // We want to continue with Self invocation no matter if current page error out.\n await invokeHandlerClient<Payload>({\n context,\n name: configuration.handlers.process,\n payload: {\n taskId,\n subTaskIndex: subTaskIndex + 1,\n identity: context.security.getIdentity()\n },\n description: \"Import pages - process - subtask\"\n });\n }\n }\n return {\n data: \"\",\n error: null\n };\n }\n );\n};\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["configuration","createRawEventHandler","payload","context","log","console","subTask","noPendingTask","prevStatusOfSubTask","PageImportExportTaskStatus","PENDING","pageBuilder","taskId","subTaskIndex","identity","mockSecurity","pageImportExportTask","getSubTask","zeroPad","status","data","error","id","pageKey","category","zipFileKey","input","fileUploadsData","updateSubTask","PROCESSING","updateStats","prevStatus","nextStatus","page","importPage","key","pbPage","createPage","updatePage","content","title","path","settings","COMPLETED","message","version","e","FAILED","name","stack","code","updateTask","invokeHandlerClient","handlers","process","security","getIdentity","description"],"sources":["index.ts"],"sourcesContent":["import { PageImportExportTaskStatus, PbPageImportExportContext } from \"~/types\";\nimport { importPage } from \"~/importPages/utils\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\ninterface Configuration {\n handlers: {\n process: string;\n };\n}\n\nexport interface Payload {\n taskId: string;\n subTaskIndex: number;\n identity: SecurityIdentity;\n}\n\nexport interface Response {\n data: string | null;\n error: Partial<Error> | null;\n}\n\nexport default (configuration: Configuration) => {\n return createRawEventHandler<Payload, PbPageImportExportContext, Response>(\n async ({ payload, context }) => {\n const log = console.log;\n let subTask;\n let noPendingTask = true;\n let prevStatusOfSubTask = PageImportExportTaskStatus.PENDING;\n\n log(\"RUNNING Import Page Queue Process\");\n const { pageBuilder } = context;\n const { taskId, subTaskIndex, identity } = payload;\n // Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks\n // and this Lambda is invoked internally, without credentials.\n mockSecurity(identity, context);\n\n try {\n /*\n * Note: We're not going to DB for getting next sub-task to process,\n * because the data might be out of sync due to GSI eventual consistency.\n */\n\n subTask = await pageBuilder.pageImportExportTask.getSubTask(\n taskId,\n zeroPad(subTaskIndex, 5)\n );\n\n /**\n * Base condition!!\n * Bail out early, if task not found or task's status is not \"pending\".\n */\n if (!subTask || subTask.status !== PageImportExportTaskStatus.PENDING) {\n noPendingTask = true;\n return {\n data: \"\",\n error: null\n };\n } else {\n noPendingTask = false;\n }\n prevStatusOfSubTask = subTask.status;\n\n log(`Fetched sub task => ${subTask.id}`);\n\n const { pageKey, category, zipFileKey, input } = subTask.data;\n const { fileUploadsData } = input;\n\n log(`Processing page key \"${pageKey}\"`);\n\n // Mark task status as PROCESSING\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {\n status: PageImportExportTaskStatus.PROCESSING\n });\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.PROCESSING\n });\n prevStatusOfSubTask = subTask.status;\n\n // Real job\n const page = await importPage({\n context,\n pageKey,\n key: zipFileKey,\n fileUploadsData\n });\n\n // Create a page\n let pbPage = await context.pageBuilder.createPage(category);\n\n // Update page with data\n pbPage = await context.pageBuilder.updatePage(pbPage.id, {\n content: page.content,\n title: page.title,\n path: page.path,\n settings: page.settings\n });\n\n // TODO: Publish page\n\n // Update task record in DB\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(taskId, subTask.id, {\n status: PageImportExportTaskStatus.COMPLETED,\n data: {\n message: \"Done\",\n page: {\n id: pbPage.id,\n title: pbPage.title,\n version: pbPage.version,\n status: pbPage.status\n }\n }\n });\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.COMPLETED\n });\n prevStatusOfSubTask = subTask.status;\n } catch (e) {\n log(\"[IMPORT_PAGES_PROCESS] Error => \", e);\n\n if (subTask && subTask.id) {\n /**\n * In case of error, we'll update the task status to \"failed\",\n * so that, client can show notify the user appropriately.\n */\n subTask = await pageBuilder.pageImportExportTask.updateSubTask(\n taskId,\n subTask.id,\n {\n status: PageImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n stack: e.stack,\n code: \"IMPORT_FAILED\"\n }\n }\n );\n\n // Update stats in main task\n await pageBuilder.pageImportExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: PageImportExportTaskStatus.FAILED\n });\n prevStatusOfSubTask = subTask.status;\n }\n\n return {\n data: null,\n error: {\n message: e.message\n }\n };\n } finally {\n // Base condition!\n if (noPendingTask) {\n log(`No pending sub-task for task ${taskId}`);\n\n await pageBuilder.pageImportExportTask.updateTask(taskId, {\n status: PageImportExportTaskStatus.COMPLETED,\n data: {\n message: `Finish importing pages.`\n }\n });\n } else {\n log(`Invoking PROCESS for task \"${subTaskIndex + 1}\"`);\n // We want to continue with Self invocation no matter if current page error out.\n await invokeHandlerClient<Payload>({\n context,\n name: configuration.handlers.process,\n payload: {\n taskId,\n subTaskIndex: subTaskIndex + 1,\n identity: context.security.getIdentity()\n },\n description: \"Import pages - process - subtask\"\n });\n }\n }\n return {\n data: \"\",\n error: null\n };\n }\n );\n};\n"],"mappings":"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"}
|