@webiny/api-page-builder-import-export 5.39.2-beta.3 → 5.39.3-beta.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (124) hide show
  1. package/export/combine/index.js +2 -2
  2. package/export/combine/index.js.map +1 -1
  3. package/export/pages/ExportPagesCleanup.d.ts +5 -0
  4. package/export/pages/ExportPagesCleanup.js +82 -0
  5. package/export/pages/ExportPagesCleanup.js.map +1 -0
  6. package/export/pages/ExportPagesController.d.ts +5 -0
  7. package/export/pages/ExportPagesController.js +31 -0
  8. package/export/pages/ExportPagesController.js.map +1 -0
  9. package/export/pages/ExportPagesZipPages.d.ts +5 -0
  10. package/export/pages/ExportPagesZipPages.js +23 -0
  11. package/export/pages/ExportPagesZipPages.js.map +1 -0
  12. package/export/pages/controller/CombineZippedPages.d.ts +5 -0
  13. package/export/pages/controller/CombineZippedPages.js +75 -0
  14. package/export/pages/controller/CombineZippedPages.js.map +1 -0
  15. package/export/pages/controller/CreateZipPagesTasks.d.ts +8 -0
  16. package/export/pages/controller/CreateZipPagesTasks.js +103 -0
  17. package/export/pages/controller/CreateZipPagesTasks.js.map +1 -0
  18. package/export/pages/controller/ProcessZipPagesTasks.d.ts +6 -0
  19. package/export/pages/controller/ProcessZipPagesTasks.js +62 -0
  20. package/export/pages/controller/ProcessZipPagesTasks.js.map +1 -0
  21. package/export/pages/types.d.ts +53 -0
  22. package/export/pages/types.js +27 -0
  23. package/export/pages/types.js.map +1 -0
  24. package/export/pages/utils.d.ts +2 -0
  25. package/export/pages/utils.js +14 -0
  26. package/export/pages/utils.js.map +1 -0
  27. package/export/pages/zipPages/ZipPages.d.ts +5 -0
  28. package/export/pages/zipPages/ZipPages.js +100 -0
  29. package/export/pages/zipPages/ZipPages.js.map +1 -0
  30. package/export/pages/zipPages/ZipPagesDataManager.d.ts +14 -0
  31. package/export/pages/zipPages/ZipPagesDataManager.js +46 -0
  32. package/export/pages/zipPages/ZipPagesDataManager.js.map +1 -0
  33. package/export/pages/zipPages/getPageFactory.d.ts +4 -0
  34. package/export/pages/zipPages/getPageFactory.js +38 -0
  35. package/export/pages/zipPages/getPageFactory.js.map +1 -0
  36. package/export/process/exporters/PageExporter.d.ts +8 -1
  37. package/export/process/exporters/PageExporter.js.map +1 -1
  38. package/export/process/index.js +2 -2
  39. package/export/process/index.js.map +1 -1
  40. package/export/s3Stream.d.ts +2 -2
  41. package/export/s3Stream.js.map +1 -1
  42. package/graphql/crud/pages.crud.d.ts +0 -1
  43. package/graphql/crud/pages.crud.js +207 -123
  44. package/graphql/crud/pages.crud.js.map +1 -1
  45. package/graphql/graphql/blocks.gql.js +3 -4
  46. package/graphql/graphql/blocks.gql.js.map +1 -1
  47. package/graphql/graphql/forms.gql.js +3 -4
  48. package/graphql/graphql/forms.gql.js.map +1 -1
  49. package/graphql/graphql/importExportTasks.gql.js +3 -4
  50. package/graphql/graphql/importExportTasks.gql.js.map +1 -1
  51. package/graphql/graphql/pages.gql.js +100 -12
  52. package/graphql/graphql/pages.gql.js.map +1 -1
  53. package/graphql/graphql/templates.gql.js +3 -4
  54. package/graphql/graphql/templates.gql.js.map +1 -1
  55. package/graphql/graphql/utils/resolve.d.ts +3 -3
  56. package/graphql/graphql/utils/resolve.js +14 -5
  57. package/graphql/graphql/utils/resolve.js.map +1 -1
  58. package/graphql/index.d.ts +1 -1
  59. package/graphql/index.js +2 -1
  60. package/graphql/index.js.map +1 -1
  61. package/graphql/types.d.ts +53 -25
  62. package/graphql/types.js.map +1 -1
  63. package/import/create/index.js +2 -2
  64. package/import/create/index.js.map +1 -1
  65. package/import/pages/ImportPagesController.d.ts +5 -0
  66. package/import/pages/ImportPagesController.js +29 -0
  67. package/import/pages/ImportPagesController.js.map +1 -0
  68. package/import/pages/ImportPagesProcessPages.d.ts +6 -0
  69. package/import/pages/ImportPagesProcessPages.js +111 -0
  70. package/import/pages/ImportPagesProcessPages.js.map +1 -0
  71. package/import/pages/controller/ImportPagesProcessPagesChecker.d.ts +6 -0
  72. package/import/pages/controller/ImportPagesProcessPagesChecker.js +40 -0
  73. package/import/pages/controller/ImportPagesProcessPagesChecker.js.map +1 -0
  74. package/import/pages/controller/ImportPagesProcessZipFile.d.ts +5 -0
  75. package/import/pages/controller/ImportPagesProcessZipFile.js +71 -0
  76. package/import/pages/controller/ImportPagesProcessZipFile.js.map +1 -0
  77. package/import/{process/pages → pages/process}/importPage.d.ts +0 -1
  78. package/import/pages/process/importPage.js.map +1 -0
  79. package/import/pages/types.d.ts +48 -0
  80. package/import/pages/types.js +21 -0
  81. package/import/pages/types.js.map +1 -0
  82. package/import/process/index.js +2 -2
  83. package/import/process/index.js.map +1 -1
  84. package/import/utils/extractAndUploadZipFileContents.js +5 -2
  85. package/import/utils/extractAndUploadZipFileContents.js.map +1 -1
  86. package/package.json +25 -23
  87. package/tasks/common/ChildTasksCleanup.d.ts +12 -0
  88. package/tasks/common/ChildTasksCleanup.js +64 -0
  89. package/tasks/common/ChildTasksCleanup.js.map +1 -0
  90. package/tasks/index.d.ts +1 -0
  91. package/tasks/index.js +13 -0
  92. package/tasks/index.js.map +1 -0
  93. package/tasks/pages/exportPagesCleanupTask.d.ts +3 -0
  94. package/tasks/pages/exportPagesCleanupTask.js +36 -0
  95. package/tasks/pages/exportPagesCleanupTask.js.map +1 -0
  96. package/tasks/pages/exportPagesControllerTask.d.ts +3 -0
  97. package/tasks/pages/exportPagesControllerTask.js +82 -0
  98. package/tasks/pages/exportPagesControllerTask.js.map +1 -0
  99. package/tasks/pages/exportPagesZipPagesTask.d.ts +3 -0
  100. package/tasks/pages/exportPagesZipPagesTask.js +39 -0
  101. package/tasks/pages/exportPagesZipPagesTask.js.map +1 -0
  102. package/tasks/pages/importPagesControllerTask.d.ts +3 -0
  103. package/tasks/pages/importPagesControllerTask.js +39 -0
  104. package/tasks/pages/importPagesControllerTask.js.map +1 -0
  105. package/tasks/pages/importPagesProcessPageTask.d.ts +3 -0
  106. package/tasks/pages/importPagesProcessPageTask.js +39 -0
  107. package/tasks/pages/importPagesProcessPageTask.js.map +1 -0
  108. package/tasks/pages/index.d.ts +1 -0
  109. package/tasks/pages/index.js +17 -0
  110. package/tasks/pages/index.js.map +1 -0
  111. package/utils/ZipFiles.d.ts +11 -0
  112. package/utils/ZipFiles.js +127 -0
  113. package/utils/ZipFiles.js.map +1 -0
  114. package/export/combine/pagesHandler.d.ts +0 -6
  115. package/export/combine/pagesHandler.js +0 -101
  116. package/export/combine/pagesHandler.js.map +0 -1
  117. package/export/process/pagesHandler.d.ts +0 -6
  118. package/export/process/pagesHandler.js +0 -191
  119. package/export/process/pagesHandler.js.map +0 -1
  120. package/import/process/pages/importPage.js.map +0 -1
  121. package/import/process/pages/pagesHandler.d.ts +0 -3
  122. package/import/process/pages/pagesHandler.js +0 -185
  123. package/import/process/pages/pagesHandler.js.map +0 -1
  124. /package/import/{process/pages → pages/process}/importPage.js +0 -0
@@ -1,101 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.pagesHandler = void 0;
7
- var _types = require("../../types");
8
- var _s3Stream = require("../s3Stream");
9
- var _zipper = require("../zipper");
10
- var _mockSecurity = require("../../mockSecurity");
11
- /**
12
- * Handles the export pages combine workflow.
13
- */
14
- const pagesHandler = async (payload, context) => {
15
- const log = console.log;
16
- log("RUNNING Export Pages Combine Handler");
17
- const {
18
- pageBuilder
19
- } = context;
20
- const {
21
- taskId,
22
- identity
23
- } = payload;
24
- (0, _mockSecurity.mockSecurity)(identity, context);
25
- try {
26
- const task = await pageBuilder.importExportTask.getTask(taskId);
27
- if (!task) {
28
- return {
29
- data: null,
30
- error: {
31
- message: `There is no task with ID "${taskId}".`
32
- }
33
- };
34
- }
35
- const {
36
- exportPagesDataKey
37
- } = task.input;
38
-
39
- // Get all files (zip) from given key
40
- const listObjectResponse = await _s3Stream.s3Stream.listObject(exportPagesDataKey);
41
- if (!listObjectResponse.Contents) {
42
- return {
43
- data: null,
44
- error: {
45
- message: "There is no Contents defined on S3 Stream while combining pages."
46
- }
47
- };
48
- }
49
- const zipFileKeys = listObjectResponse.Contents.filter(file => file.Key !== exportPagesDataKey).map(file => file.Key).filter(Boolean);
50
-
51
- // Prepare zip of all zips
52
- const zipOfZip = new _zipper.ZipOfZip(zipFileKeys, "WEBINY_PAGE_EXPORT.zip");
53
-
54
- // Upload
55
- const pageExportUpload = await zipOfZip.process();
56
- log(`Done uploading... File is located at ${pageExportUpload.Location} `);
57
-
58
- // Update task status and save export page data key
59
- await pageBuilder.importExportTask.updateTask(taskId, {
60
- status: _types.ImportExportTaskStatus.COMPLETED,
61
- data: {
62
- message: `Finish uploading page export.`,
63
- key: pageExportUpload.Key,
64
- url: await _s3Stream.s3Stream.getPresignedUrl(pageExportUpload.Key)
65
- }
66
- });
67
-
68
- // Remove individual zip files from storage
69
- const deleteFilePromises = zipFileKeys.map(key => _s3Stream.s3Stream.deleteObject(key));
70
- await Promise.all(deleteFilePromises);
71
- log(`Successfully deleted ${deleteFilePromises.length} zip files.`);
72
- } catch (e) {
73
- log("[EXPORT_PAGES_COMBINE] Error => ", e.message);
74
-
75
- /**
76
- * In case of error, we'll update the task status to "failed",
77
- * so that, client can show notify the user appropriately.
78
- */
79
- await pageBuilder.importExportTask.updateTask(taskId, {
80
- status: _types.ImportExportTaskStatus.FAILED,
81
- error: {
82
- name: e.name,
83
- message: e.message,
84
- code: "EXPORT_FAILED"
85
- }
86
- });
87
- return {
88
- data: null,
89
- error: {
90
- message: e.message
91
- }
92
- };
93
- }
94
- return {
95
- data: "",
96
- error: null
97
- };
98
- };
99
- exports.pagesHandler = pagesHandler;
100
-
101
- //# sourceMappingURL=pagesHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_types","require","_s3Stream","_zipper","_mockSecurity","pagesHandler","payload","context","log","console","pageBuilder","taskId","identity","mockSecurity","task","importExportTask","getTask","data","error","message","exportPagesDataKey","input","listObjectResponse","s3Stream","listObject","Contents","zipFileKeys","filter","file","Key","map","Boolean","zipOfZip","ZipOfZip","pageExportUpload","process","Location","updateTask","status","ImportExportTaskStatus","COMPLETED","key","url","getPresignedUrl","deleteFilePromises","deleteObject","Promise","all","length","e","FAILED","name","code","exports"],"sources":["pagesHandler.ts"],"sourcesContent":["import { ImportExportTaskStatus, PbImportExportContext } from \"~/types\";\nimport { s3Stream } from \"../s3Stream\";\nimport { ZipOfZip } from \"../zipper\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { Payload, Response } from \"~/export/combine\";\n\n/**\n * Handles the export pages combine workflow.\n */\nexport const pagesHandler = async (\n payload: Payload,\n context: PbImportExportContext\n): Promise<Response> => {\n const log = console.log;\n\n log(\"RUNNING Export Pages Combine Handler\");\n const { pageBuilder } = context;\n const { taskId, identity } = payload;\n\n mockSecurity(identity, context);\n\n try {\n const task = await pageBuilder.importExportTask.getTask(taskId);\n if (!task) {\n return {\n data: null,\n error: {\n message: `There is no task with ID \"${taskId}\".`\n }\n };\n }\n\n const { exportPagesDataKey } = task.input;\n\n // Get all files (zip) from given key\n const listObjectResponse = await s3Stream.listObject(exportPagesDataKey);\n if (!listObjectResponse.Contents) {\n return {\n data: null,\n error: {\n message: \"There is no Contents defined on S3 Stream while combining pages.\"\n }\n };\n }\n\n const zipFileKeys = listObjectResponse.Contents.filter(\n file => file.Key !== exportPagesDataKey\n )\n .map(file => file.Key)\n .filter(Boolean) as string[];\n\n // Prepare zip of all zips\n const zipOfZip = new ZipOfZip(zipFileKeys, \"WEBINY_PAGE_EXPORT.zip\");\n\n // Upload\n const pageExportUpload = await zipOfZip.process();\n log(`Done uploading... File is located at ${pageExportUpload.Location} `);\n\n // Update task status and save export page data key\n await pageBuilder.importExportTask.updateTask(taskId, {\n status: ImportExportTaskStatus.COMPLETED,\n data: {\n message: `Finish uploading page export.`,\n key: pageExportUpload.Key,\n url: await s3Stream.getPresignedUrl(pageExportUpload.Key)\n }\n });\n\n // Remove individual zip files from storage\n const deleteFilePromises = zipFileKeys.map(key => s3Stream.deleteObject(key));\n await Promise.all(deleteFilePromises);\n log(`Successfully deleted ${deleteFilePromises.length} zip files.`);\n } catch (e) {\n log(\"[EXPORT_PAGES_COMBINE] Error => \", e.message);\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 await pageBuilder.importExportTask.updateTask(taskId, {\n status: ImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n code: \"EXPORT_FAILED\"\n }\n });\n\n return {\n data: null,\n error: {\n message: e.message\n }\n };\n }\n return {\n data: \"\",\n error: null\n };\n};\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import { PbImportExportContext } from "../../types";
2
- import { Configuration, Payload, Response } from "./";
3
- /**
4
- * Handles the export pages process workflow.
5
- */
6
- export declare const pagesHandler: (configuration: Configuration, payload: Payload, context: PbImportExportContext) => Promise<Response>;
@@ -1,191 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.pagesHandler = void 0;
7
- var _types = require("../../types");
8
- var _client = require("../../client");
9
- var _handlerGraphql = require("@webiny/handler-graphql");
10
- var _mockSecurity = require("../../mockSecurity");
11
- var _utils = require("@webiny/utils");
12
- var _PageExporter = require("./exporters/PageExporter");
13
- /**
14
- * Handles the export pages process workflow.
15
- */
16
- const pagesHandler = async (configuration, payload, context) => {
17
- const log = console.log;
18
- let subTask;
19
- let noPendingTask = true;
20
- let prevStatusOfSubTask = _types.ImportExportTaskStatus.PENDING;
21
- log("RUNNING Export Pages Process Handler");
22
- const {
23
- pageBuilder,
24
- fileManager
25
- } = context;
26
- const {
27
- taskId,
28
- subTaskIndex,
29
- type,
30
- identity
31
- } = payload;
32
- // Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks
33
- // and this Lambda is invoked internally, without credentials.
34
- (0, _mockSecurity.mockSecurity)(identity, context);
35
- try {
36
- /*
37
- * Note: We're not going to DB for finding the next sub-task to process,
38
- * because the data might be out of sync due to GSI eventual consistency.
39
- */
40
- subTask = await pageBuilder.importExportTask.getSubTask(taskId, (0, _utils.zeroPad)(subTaskIndex, 5));
41
- /**
42
- * Base condition!!
43
- * Bail out early, if task not found or task's status is not "pending".
44
- */
45
- if (!subTask || subTask.status !== _types.ImportExportTaskStatus.PENDING) {
46
- noPendingTask = true;
47
- return {
48
- data: "",
49
- error: null
50
- };
51
- } else {
52
- noPendingTask = false;
53
- }
54
- log(`Fetched sub task => ${subTask.id}`);
55
- const {
56
- input
57
- } = subTask;
58
- const {
59
- pageId,
60
- exportPagesDataKey,
61
- revisionType
62
- } = input;
63
-
64
- /**
65
- * At the moment, we only export a single revision of the page.
66
- * It could be "published" or "latest" depending upon user input.
67
- *
68
- * Note: In case of no "published" revision available, we use the latest revision.
69
- */
70
- let page;
71
- try {
72
- if (revisionType === _types.ExportRevisionType.PUBLISHED) {
73
- // Get "published" page.
74
- page = await pageBuilder.getPublishedPageById({
75
- id: pageId
76
- });
77
- } else {
78
- // Get "latest" page.
79
- page = await pageBuilder.getPage(pageId);
80
- }
81
- } catch (e) {
82
- // If we're looking for "published" page and doesn't found it, get latest page.
83
- if (revisionType === _types.ExportRevisionType.PUBLISHED && e instanceof _handlerGraphql.NotFoundError) {
84
- page = await pageBuilder.getPage(pageId);
85
- } else {
86
- throw e;
87
- }
88
- }
89
- if (!page) {
90
- log(`Unable to load page "${pageId}"`);
91
- throw new _handlerGraphql.NotFoundError(`Unable to load page "${pageId}"`);
92
- }
93
- log(`Processing page key "${pageId}" | version ${page.version} | ${page.status}`);
94
-
95
- // Mark task status as PROCESSING
96
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
97
- status: _types.ImportExportTaskStatus.PROCESSING
98
- });
99
- // Update stats in main task
100
- await pageBuilder.importExportTask.updateStats(taskId, {
101
- prevStatus: prevStatusOfSubTask,
102
- nextStatus: _types.ImportExportTaskStatus.PROCESSING
103
- });
104
- prevStatusOfSubTask = subTask.status;
105
- log(`Extracting page data and uploading to storage...`);
106
- const pageExporter = new _PageExporter.PageExporter(fileManager);
107
- const pageDataZip = await pageExporter.execute(page, exportPagesDataKey);
108
- log(`Finish uploading zip...`);
109
- // Update task record in DB
110
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
111
- status: _types.ImportExportTaskStatus.COMPLETED,
112
- data: {
113
- message: `Finish uploading data for page "${page.id}" v${page.version} (${page.status}).`,
114
- key: pageDataZip.Key
115
- }
116
- });
117
- // Update stats in main task
118
- await pageBuilder.importExportTask.updateStats(taskId, {
119
- prevStatus: prevStatusOfSubTask,
120
- nextStatus: _types.ImportExportTaskStatus.COMPLETED
121
- });
122
- prevStatusOfSubTask = subTask.status;
123
- } catch (e) {
124
- log("[EXPORT_PAGES_PROCESS] Error => ", e);
125
- if (subTask && subTask.id) {
126
- /**
127
- * In case of error, we'll update the task status to "failed",
128
- * so that, client can show notify the user appropriately.
129
- */
130
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
131
- status: _types.ImportExportTaskStatus.FAILED,
132
- error: {
133
- name: e.name,
134
- message: e.message,
135
- stack: e.stack,
136
- code: "EXPORT_FAILED"
137
- }
138
- });
139
-
140
- // Update stats in main task
141
- await pageBuilder.importExportTask.updateStats(taskId, {
142
- prevStatus: prevStatusOfSubTask,
143
- nextStatus: _types.ImportExportTaskStatus.FAILED
144
- });
145
- prevStatusOfSubTask = subTask.status;
146
- }
147
- return {
148
- data: null,
149
- error: {
150
- message: e.message
151
- }
152
- };
153
- } finally {
154
- // Base condition!
155
- if (noPendingTask) {
156
- log(`No pending sub-task for task ${taskId}`);
157
- // Combine individual page zip files.
158
- await (0, _client.invokeHandlerClient)({
159
- context,
160
- name: configuration.handlers.combine,
161
- payload: {
162
- taskId,
163
- type,
164
- identity: context.security.getIdentity()
165
- },
166
- description: "Export pages - combine"
167
- });
168
- } else {
169
- console.log(`Invoking PROCESS for task "${subTaskIndex + 1}"`);
170
- // We want to continue with Self invocation no matter if current page error out.
171
- await (0, _client.invokeHandlerClient)({
172
- context,
173
- name: configuration.handlers.process,
174
- payload: {
175
- taskId,
176
- type,
177
- subTaskIndex: subTaskIndex + 1,
178
- identity: context.security.getIdentity()
179
- },
180
- description: "Export pages - process - subtask"
181
- });
182
- }
183
- }
184
- return {
185
- data: "",
186
- error: null
187
- };
188
- };
189
- exports.pagesHandler = pagesHandler;
190
-
191
- //# sourceMappingURL=pagesHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_types","require","_client","_handlerGraphql","_mockSecurity","_utils","_PageExporter","pagesHandler","configuration","payload","context","log","console","subTask","noPendingTask","prevStatusOfSubTask","ImportExportTaskStatus","PENDING","pageBuilder","fileManager","taskId","subTaskIndex","type","identity","mockSecurity","importExportTask","getSubTask","zeroPad","status","data","error","id","input","pageId","exportPagesDataKey","revisionType","page","ExportRevisionType","PUBLISHED","getPublishedPageById","getPage","e","NotFoundError","version","updateSubTask","PROCESSING","updateStats","prevStatus","nextStatus","pageExporter","PageExporter","pageDataZip","execute","COMPLETED","message","key","Key","FAILED","name","stack","code","invokeHandlerClient","handlers","combine","security","getIdentity","description","process","exports"],"sources":["pagesHandler.ts"],"sourcesContent":["import { ExportRevisionType, ImportExportTaskStatus, PbImportExportContext } from \"~/types\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { Payload as ExtractPayload } from \"../combine\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { Configuration, Payload, Response } from \"~/export/process\";\nimport { PageExporter } from \"./exporters/PageExporter\";\n\n/**\n * Handles the export pages process workflow.\n */\nexport const pagesHandler = async (\n configuration: Configuration,\n payload: Payload,\n context: PbImportExportContext\n): Promise<Response> => {\n const log = console.log;\n let subTask;\n let noPendingTask = true;\n let prevStatusOfSubTask = ImportExportTaskStatus.PENDING;\n\n log(\"RUNNING Export Pages Process Handler\");\n const { pageBuilder, fileManager } = context;\n const { taskId, subTaskIndex, type, 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 as SecurityIdentity, context);\n\n try {\n /*\n * Note: We're not going to DB for finding the next sub-task to process,\n * because the data might be out of sync due to GSI eventual consistency.\n */\n subTask = await pageBuilder.importExportTask.getSubTask(taskId, zeroPad(subTaskIndex, 5));\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 !== ImportExportTaskStatus.PENDING) {\n noPendingTask = true;\n return {\n data: \"\",\n error: null\n };\n } else {\n noPendingTask = false;\n }\n\n log(`Fetched sub task => ${subTask.id}`);\n\n const { input } = subTask;\n const { pageId, exportPagesDataKey, revisionType } = input;\n\n /**\n * At the moment, we only export a single revision of the page.\n * It could be \"published\" or \"latest\" depending upon user input.\n *\n * Note: In case of no \"published\" revision available, we use the latest revision.\n */\n let page;\n try {\n if (revisionType === ExportRevisionType.PUBLISHED) {\n // Get \"published\" page.\n page = await pageBuilder.getPublishedPageById({ id: pageId });\n } else {\n // Get \"latest\" page.\n page = await pageBuilder.getPage(pageId);\n }\n } catch (e) {\n // If we're looking for \"published\" page and doesn't found it, get latest page.\n if (revisionType === ExportRevisionType.PUBLISHED && e instanceof NotFoundError) {\n page = await pageBuilder.getPage(pageId);\n } else {\n throw e;\n }\n }\n\n if (!page) {\n log(`Unable to load page \"${pageId}\"`);\n throw new NotFoundError(`Unable to load page \"${pageId}\"`);\n }\n\n log(`Processing page key \"${pageId}\" | version ${page.version} | ${page.status}`);\n\n // Mark task status as PROCESSING\n subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.PROCESSING\n });\n // Update stats in main task\n await pageBuilder.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.PROCESSING\n });\n prevStatusOfSubTask = subTask.status;\n\n log(`Extracting page data and uploading to storage...`);\n\n const pageExporter = new PageExporter(fileManager);\n const pageDataZip = await pageExporter.execute(page, exportPagesDataKey);\n\n log(`Finish uploading zip...`);\n // Update task record in DB\n subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.COMPLETED,\n data: {\n message: `Finish uploading data for page \"${page.id}\" v${page.version} (${page.status}).`,\n key: pageDataZip.Key\n }\n });\n // Update stats in main task\n await pageBuilder.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.COMPLETED\n });\n prevStatusOfSubTask = subTask.status;\n } catch (e) {\n log(\"[EXPORT_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.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n stack: e.stack,\n code: \"EXPORT_FAILED\"\n }\n });\n\n // Update stats in main task\n await pageBuilder.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.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 // Combine individual page zip files.\n await invokeHandlerClient<ExtractPayload>({\n context,\n name: configuration.handlers.combine,\n payload: {\n taskId,\n type,\n identity: context.security.getIdentity()\n },\n description: \"Export pages - combine\"\n });\n } else {\n console.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 type,\n subTaskIndex: subTaskIndex + 1,\n identity: context.security.getIdentity()\n },\n description: \"Export pages - process - subtask\"\n });\n }\n }\n return {\n data: \"\",\n error: null\n };\n};\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"names":["_path","_interopRequireDefault","require","_dotPropImmutable","_loadJsonFile","_fsExtra","_downloadInstallFiles","_constants","_s3Stream","_utils","importPage","pageKey","context","fileUploadsData","log","console","PAGE_EXTRACT_DIR","path","join","INSTALL_EXTRACT_DIR","ensureDirSync","pageDataFileKey","dotProp","get","PAGE_DATA_FILE_PATH","basename","readStream","s3Stream","writeStream","createWriteStream","Promise","resolve","reject","on","pipe","page","files","loadJson","Array","isArray","length","fileIdToNewFileMap","uploadAssets","settings","fileManager","getSettings","srcPrefix","updateFilesInData","data","content","updateImageInPageSettings","deleteFile","deleteS3Folder","dirname","params","newSettings","cleanSrcPrefix","endsWith","slice","newFile","general","image","id","set","key","social"],"sources":["importPage.ts"],"sourcesContent":["import path from \"path\";\nimport dotProp from \"dot-prop-immutable\";\nimport loadJson from \"load-json-file\";\nimport { createWriteStream, ensureDirSync } from \"fs-extra\";\nimport { deleteFile } from \"@webiny/api-page-builder/graphql/crud/install/utils/downloadInstallFiles\";\nimport { FileInput } from \"@webiny/api-file-manager/types\";\nimport { PageSettings } from \"@webiny/api-page-builder/types\";\nimport { PbImportExportContext } from \"~/graphql/types\";\nimport { FileUploadsData } from \"~/types\";\nimport { INSTALL_EXTRACT_DIR } from \"~/import/constants\";\nimport { s3Stream } from \"~/export/s3Stream\";\nimport { deleteS3Folder, updateFilesInData, uploadAssets } from \"~/import/utils\";\nimport { ExportedPageData } from \"~/export/process/exporters/PageExporter\";\n\ninterface ImportPageParams {\n key: string;\n pageKey: string;\n context: PbImportExportContext;\n fileUploadsData: FileUploadsData;\n}\n\nexport async function importPage({\n pageKey,\n context,\n fileUploadsData\n}: ImportPageParams): Promise<ExportedPageData[\"page\"]> {\n const log = console.log;\n\n // Making Directory for page in which we're going to extract the page data file.\n const PAGE_EXTRACT_DIR = path.join(INSTALL_EXTRACT_DIR, pageKey);\n ensureDirSync(PAGE_EXTRACT_DIR);\n\n const pageDataFileKey = dotProp.get(fileUploadsData, `data`);\n const PAGE_DATA_FILE_PATH = path.join(PAGE_EXTRACT_DIR, path.basename(pageDataFileKey));\n\n log(`Downloading Page data file: ${pageDataFileKey} at \"${PAGE_DATA_FILE_PATH}\"`);\n // Download and save page data file in disk.\n const readStream = await s3Stream.readStream(pageDataFileKey);\n const writeStream = createWriteStream(PAGE_DATA_FILE_PATH);\n\n await new Promise((resolve, reject) => {\n readStream.on(\"error\", reject).pipe(writeStream).on(\"finish\", resolve).on(\"error\", reject);\n });\n\n // Load the page data file from disk.\n log(`Load file ${pageDataFileKey}`);\n const { page, files } = await loadJson<ExportedPageData>(PAGE_DATA_FILE_PATH);\n\n // Only update page data if there are files.\n if (files && Array.isArray(files) && files.length > 0) {\n const fileIdToNewFileMap = await uploadAssets({\n context,\n files,\n fileUploadsData\n });\n\n const settings = await context.fileManager.getSettings();\n\n const { srcPrefix = \"\" } = settings || {};\n updateFilesInData({\n data: page.content || {},\n fileIdToNewFileMap,\n srcPrefix\n });\n\n page.settings = updateImageInPageSettings({\n settings: page.settings || {},\n fileIdToNewFileMap,\n srcPrefix\n });\n }\n\n log(\"Removing Directory for page...\");\n await deleteFile(pageKey);\n\n log(`Remove page contents from S3...`);\n await deleteS3Folder(path.dirname(fileUploadsData.data));\n\n return page;\n}\n\ninterface UpdateImageInPageSettingsParams {\n fileIdToNewFileMap: Map<string, FileInput>;\n srcPrefix: string;\n settings: PageSettings;\n}\n\nfunction updateImageInPageSettings(\n params: UpdateImageInPageSettingsParams\n): UpdateImageInPageSettingsParams[\"settings\"] {\n const { settings, fileIdToNewFileMap, srcPrefix } = params;\n let newSettings = settings;\n\n const cleanSrcPrefix = srcPrefix.endsWith(\"/\") ? srcPrefix.slice(0, -1) : srcPrefix;\n\n if (dotProp.get(newSettings, \"general.image.src\")) {\n const newFile = fileIdToNewFileMap.get(settings.general?.image?.id || \"\");\n if (newFile) {\n newSettings = dotProp.set(\n newSettings,\n \"general.image.src\",\n `${cleanSrcPrefix}/${newFile.key}`\n );\n }\n }\n\n if (dotProp.get(newSettings, \"social.image.src\")) {\n const newFile = fileIdToNewFileMap.get(settings.social?.image?.id || \"\");\n\n if (newFile) {\n newSettings = dotProp.set(\n newSettings,\n \"social.image.src\",\n `${cleanSrcPrefix}/${newFile.key}`\n );\n }\n }\n\n return newSettings;\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { PbImportExportContext } from "../../../types";
2
- import { Configuration, Payload, Response } from "..";
3
- export declare const pagesHandler: (configuration: Configuration, payload: Payload, context: PbImportExportContext) => Promise<Response>;
@@ -1,185 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.pagesHandler = void 0;
7
- var _types = require("../../../types");
8
- var _importPage = require("./importPage");
9
- var _client = require("../../../client");
10
- var _mockSecurity = require("../../../mockSecurity");
11
- var _utils = require("@webiny/utils");
12
- const pagesHandler = async (configuration, payload, context) => {
13
- const log = console.log;
14
- let subTask;
15
- let noPendingTask = true;
16
- let prevStatusOfSubTask = _types.ImportExportTaskStatus.PENDING;
17
- log("RUNNING Import Page Queue Process");
18
- const {
19
- pageBuilder
20
- } = context;
21
- const {
22
- taskId,
23
- subTaskIndex,
24
- type,
25
- identity
26
- } = payload;
27
- // Disable authorization; this is necessary because we call Page Builder CRUD methods which include authorization checks
28
- // and this Lambda is invoked internally, without credentials.
29
- (0, _mockSecurity.mockSecurity)(identity, context);
30
- try {
31
- /*
32
- * Note: We're not going to DB for getting next sub-task to process,
33
- * because the data might be out of sync due to GSI eventual consistency.
34
- */
35
-
36
- subTask = await pageBuilder.importExportTask.getSubTask(taskId, (0, _utils.zeroPad)(subTaskIndex, 5));
37
-
38
- /**
39
- * Base condition!!
40
- * Bail out early, if task not found or task's status is not "pending".
41
- */
42
- if (!subTask || subTask.status !== _types.ImportExportTaskStatus.PENDING) {
43
- noPendingTask = true;
44
- return {
45
- data: "",
46
- error: null
47
- };
48
- } else {
49
- noPendingTask = false;
50
- }
51
- prevStatusOfSubTask = subTask.status;
52
- log(`Fetched sub task => ${subTask.id}`);
53
- const {
54
- pageKey,
55
- category,
56
- zipFileKey,
57
- input,
58
- meta
59
- } = subTask.data;
60
- const {
61
- fileUploadsData
62
- } = input;
63
- log(`Processing page key "${pageKey}"`);
64
-
65
- // Mark task status as PROCESSING
66
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
67
- status: _types.ImportExportTaskStatus.PROCESSING
68
- });
69
- // Update stats in main task
70
- await pageBuilder.importExportTask.updateStats(taskId, {
71
- prevStatus: prevStatusOfSubTask,
72
- nextStatus: _types.ImportExportTaskStatus.PROCESSING
73
- });
74
- prevStatusOfSubTask = subTask.status;
75
-
76
- // Real job
77
- const page = await (0, _importPage.importPage)({
78
- context,
79
- pageKey,
80
- key: zipFileKey,
81
- fileUploadsData
82
- });
83
-
84
- // Create a page
85
- let pbPage = await context.pageBuilder.createPage(category, meta);
86
-
87
- // Hooks attached to `pageBuilder.createPage` might enable security back again, here we disable security
88
- (0, _mockSecurity.mockSecurity)(identity, context);
89
-
90
- // Update page with data
91
- pbPage = await context.pageBuilder.updatePage(pbPage.id, {
92
- content: page.content,
93
- title: page.title,
94
- path: page.path,
95
- settings: page.settings
96
- });
97
-
98
- // Hooks attached to `pageBuilder.updatePage` might enable security back again, here we disable security
99
- (0, _mockSecurity.mockSecurity)(identity, context);
100
-
101
- // TODO: Publish page
102
-
103
- // Update task record in DB
104
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
105
- status: _types.ImportExportTaskStatus.COMPLETED,
106
- data: {
107
- message: "Done",
108
- page: {
109
- id: pbPage.id,
110
- title: pbPage.title,
111
- version: pbPage.version,
112
- status: pbPage.status
113
- }
114
- }
115
- });
116
- // Update stats in main task
117
- await pageBuilder.importExportTask.updateStats(taskId, {
118
- prevStatus: prevStatusOfSubTask,
119
- nextStatus: _types.ImportExportTaskStatus.COMPLETED
120
- });
121
- prevStatusOfSubTask = subTask.status;
122
- } catch (e) {
123
- log("[IMPORT_PAGES_PROCESS] Error => ", e);
124
- if (subTask && subTask.id) {
125
- /**
126
- * In case of error, we'll update the task status to "failed",
127
- * so that, client can show notify the user appropriately.
128
- */
129
- subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {
130
- status: _types.ImportExportTaskStatus.FAILED,
131
- error: {
132
- name: e.name,
133
- message: e.message,
134
- stack: e.stack,
135
- code: "IMPORT_FAILED"
136
- }
137
- });
138
-
139
- // Update stats in main task
140
- await pageBuilder.importExportTask.updateStats(taskId, {
141
- prevStatus: prevStatusOfSubTask,
142
- nextStatus: _types.ImportExportTaskStatus.FAILED
143
- });
144
- prevStatusOfSubTask = subTask.status;
145
- }
146
- return {
147
- data: null,
148
- error: {
149
- message: e.message
150
- }
151
- };
152
- } finally {
153
- // Base condition!
154
- if (noPendingTask) {
155
- log(`No pending sub-task for task ${taskId}`);
156
- await pageBuilder.importExportTask.updateTask(taskId, {
157
- status: _types.ImportExportTaskStatus.COMPLETED,
158
- data: {
159
- message: `Finish importing pages.`
160
- }
161
- });
162
- } else {
163
- log(`Invoking PROCESS for task "${subTaskIndex + 1}"`);
164
- // We want to continue with Self invocation no matter if current page error out.
165
- await (0, _client.invokeHandlerClient)({
166
- context,
167
- name: configuration.handlers.process,
168
- payload: {
169
- taskId,
170
- subTaskIndex: subTaskIndex + 1,
171
- type,
172
- identity: context.security.getIdentity()
173
- },
174
- description: "Import pages - process - subtask"
175
- });
176
- }
177
- }
178
- return {
179
- data: "",
180
- error: null
181
- };
182
- };
183
- exports.pagesHandler = pagesHandler;
184
-
185
- //# sourceMappingURL=pagesHandler.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["_types","require","_importPage","_client","_mockSecurity","_utils","pagesHandler","configuration","payload","context","log","console","subTask","noPendingTask","prevStatusOfSubTask","ImportExportTaskStatus","PENDING","pageBuilder","taskId","subTaskIndex","type","identity","mockSecurity","importExportTask","getSubTask","zeroPad","status","data","error","id","pageKey","category","zipFileKey","input","meta","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","exports"],"sources":["pagesHandler.ts"],"sourcesContent":["import { ImportExportTaskStatus, PbImportExportContext } from \"~/types\";\nimport { importPage } from \"./importPage\";\nimport { invokeHandlerClient } from \"~/client\";\nimport { mockSecurity } from \"~/mockSecurity\";\nimport { zeroPad } from \"@webiny/utils\";\nimport { Configuration, Payload, Response } from \"~/import/process\";\n\nexport const pagesHandler = async (\n configuration: Configuration,\n payload: Payload,\n context: PbImportExportContext\n): Promise<Response> => {\n const log = console.log;\n let subTask;\n let noPendingTask = true;\n let prevStatusOfSubTask = ImportExportTaskStatus.PENDING;\n\n log(\"RUNNING Import Page Queue Process\");\n const { pageBuilder } = context;\n const { taskId, subTaskIndex, type, 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.importExportTask.getSubTask(taskId, zeroPad(subTaskIndex, 5));\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 !== ImportExportTaskStatus.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, meta } = subTask.data;\n const { fileUploadsData } = input;\n\n log(`Processing page key \"${pageKey}\"`);\n\n // Mark task status as PROCESSING\n subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.PROCESSING\n });\n // Update stats in main task\n await pageBuilder.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.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, meta);\n\n // Hooks attached to `pageBuilder.createPage` might enable security back again, here we disable security\n mockSecurity(identity, context);\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 // Hooks attached to `pageBuilder.updatePage` might enable security back again, here we disable security\n mockSecurity(identity, context);\n\n // TODO: Publish page\n\n // Update task record in DB\n subTask = await pageBuilder.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.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.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.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.importExportTask.updateSubTask(taskId, subTask.id, {\n status: ImportExportTaskStatus.FAILED,\n error: {\n name: e.name,\n message: e.message,\n stack: e.stack,\n code: \"IMPORT_FAILED\"\n }\n });\n\n // Update stats in main task\n await pageBuilder.importExportTask.updateStats(taskId, {\n prevStatus: prevStatusOfSubTask,\n nextStatus: ImportExportTaskStatus.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.importExportTask.updateTask(taskId, {\n status: ImportExportTaskStatus.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 type,\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"],"mappings":"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"}