@webiny/api-apw 0.0.0-unstable.6e5425ee89 → 0.0.0-unstable.78f581c1d2

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.
Files changed (207) hide show
  1. package/ApwChangeRequestNotification.js +10 -0
  2. package/ApwChangeRequestNotification.js.map +1 -1
  3. package/ApwCommentNotification.js +10 -0
  4. package/ApwCommentNotification.js.map +1 -1
  5. package/ApwContentReviewNotification.js +10 -0
  6. package/ApwContentReviewNotification.js.map +1 -1
  7. package/ApwContentUrlPlugin.js +10 -0
  8. package/ApwContentUrlPlugin.js.map +1 -1
  9. package/ContentApwSettingsPlugin.js +5 -0
  10. package/ContentApwSettingsPlugin.js.map +1 -1
  11. package/crud/createChangeRequestMethods.js +11 -4
  12. package/crud/createChangeRequestMethods.js.map +1 -1
  13. package/crud/createCommentMethods.js +12 -4
  14. package/crud/createCommentMethods.js.map +1 -1
  15. package/crud/createContentReviewMethods.js +84 -20
  16. package/crud/createContentReviewMethods.js.map +1 -1
  17. package/crud/createReviewerMethods.js +12 -4
  18. package/crud/createReviewerMethods.js.map +1 -1
  19. package/crud/createWorkflowMethods.js +17 -4
  20. package/crud/createWorkflowMethods.js.map +1 -1
  21. package/crud/index.js +25 -0
  22. package/crud/index.js.map +1 -1
  23. package/crud/utils.js +28 -0
  24. package/crud/utils.js.map +1 -1
  25. package/index.js +11 -1
  26. package/index.js.map +1 -1
  27. package/package.json +34 -34
  28. package/plugins/cms/CmsEntryApwSettingsGetterPlugin.js +15 -0
  29. package/plugins/cms/CmsEntryApwSettingsGetterPlugin.js.map +1 -1
  30. package/plugins/cms/apwEntryPlugins.js +8 -0
  31. package/plugins/cms/apwEntryPlugins.js.map +1 -1
  32. package/plugins/cms/index.js +13 -0
  33. package/plugins/cms/index.js.map +1 -1
  34. package/plugins/cms/linkContentReviewToEntry.js +17 -0
  35. package/plugins/cms/linkContentReviewToEntry.js.map +1 -1
  36. package/plugins/cms/linkWorkflowToEntry.js +31 -2
  37. package/plugins/cms/linkWorkflowToEntry.js.map +1 -1
  38. package/plugins/cms/notifications/changeRequestNotification.js +4 -0
  39. package/plugins/cms/notifications/changeRequestNotification.js.map +1 -1
  40. package/plugins/cms/notifications/commentNotification.js +4 -0
  41. package/plugins/cms/notifications/commentNotification.js.map +1 -1
  42. package/plugins/cms/notifications/contentReviewNotification.js +4 -0
  43. package/plugins/cms/notifications/contentReviewNotification.js.map +1 -1
  44. package/plugins/cms/notifications/contentUrl.js +8 -1
  45. package/plugins/cms/notifications/contentUrl.js.map +1 -1
  46. package/plugins/cms/triggerContentReview.js +14 -0
  47. package/plugins/cms/triggerContentReview.js.map +1 -1
  48. package/plugins/cms/updateContentReviewStatus.js +18 -0
  49. package/plugins/cms/updateContentReviewStatus.js.map +1 -1
  50. package/plugins/cms/utils.js +47 -2
  51. package/plugins/cms/utils.js.map +1 -1
  52. package/plugins/context.js +31 -0
  53. package/plugins/context.js.map +1 -1
  54. package/plugins/graphql/changeRequest.gql.js +8 -1
  55. package/plugins/graphql/changeRequest.gql.js.map +1 -1
  56. package/plugins/graphql/comment.gql.js +8 -1
  57. package/plugins/graphql/comment.gql.js.map +1 -1
  58. package/plugins/graphql/contentReview.gql.js +20 -1
  59. package/plugins/graphql/contentReview.gql.js.map +1 -1
  60. package/plugins/graphql/reviewer.gql.js +8 -1
  61. package/plugins/graphql/reviewer.gql.js.map +1 -1
  62. package/plugins/graphql/workflow.gql.js +8 -1
  63. package/plugins/graphql/workflow.gql.js.map +1 -1
  64. package/plugins/graphql.js +16 -1
  65. package/plugins/graphql.js.map +1 -1
  66. package/plugins/hooks/createReviewerFromIdentity.js +11 -2
  67. package/plugins/hooks/createReviewerFromIdentity.js.map +1 -1
  68. package/plugins/hooks/deleteChangeRequestsAfterContentReview.js +9 -1
  69. package/plugins/hooks/deleteChangeRequestsAfterContentReview.js.map +1 -1
  70. package/plugins/hooks/deleteCommentsAfterChangeRequest.js +8 -1
  71. package/plugins/hooks/deleteCommentsAfterChangeRequest.js.map +1 -1
  72. package/plugins/hooks/index.js +14 -0
  73. package/plugins/hooks/index.js.map +1 -1
  74. package/plugins/hooks/initializeContentReviewSteps.js +15 -2
  75. package/plugins/hooks/initializeContentReviewSteps.js.map +1 -1
  76. package/plugins/hooks/initializeNotifications.js +5 -0
  77. package/plugins/hooks/initializeNotifications.js.map +1 -1
  78. package/plugins/hooks/listContentReviews.js +12 -0
  79. package/plugins/hooks/listContentReviews.js.map +1 -1
  80. package/plugins/hooks/notifications/appUrl.js +4 -0
  81. package/plugins/hooks/notifications/appUrl.js.map +1 -1
  82. package/plugins/hooks/notifications/changeRequestAfterCreate.js +28 -0
  83. package/plugins/hooks/notifications/changeRequestAfterCreate.js.map +1 -1
  84. package/plugins/hooks/notifications/changeRequestUrl.js +4 -0
  85. package/plugins/hooks/notifications/changeRequestUrl.js.map +1 -1
  86. package/plugins/hooks/notifications/commentAfterCreate.js +30 -0
  87. package/plugins/hooks/notifications/commentAfterCreate.js.map +1 -1
  88. package/plugins/hooks/notifications/commentUrl.js +4 -0
  89. package/plugins/hooks/notifications/commentUrl.js.map +1 -1
  90. package/plugins/hooks/notifications/contentReviewAfterCreate.js +24 -1
  91. package/plugins/hooks/notifications/contentReviewAfterCreate.js.map +1 -1
  92. package/plugins/hooks/notifications/contentReviewUrl.js +4 -0
  93. package/plugins/hooks/notifications/contentReviewUrl.js.map +1 -1
  94. package/plugins/hooks/notifications/contentUrl.js +5 -0
  95. package/plugins/hooks/notifications/contentUrl.js.map +1 -1
  96. package/plugins/hooks/notifications/lastChangeRequestNotificationPlugin.js +4 -0
  97. package/plugins/hooks/notifications/lastChangeRequestNotificationPlugin.js.map +1 -1
  98. package/plugins/hooks/notifications/lastCommentNotificationPlugin.js +4 -0
  99. package/plugins/hooks/notifications/lastCommentNotificationPlugin.js.map +1 -1
  100. package/plugins/hooks/notifications/lastContentReviewNotificationPlugin.js +4 -0
  101. package/plugins/hooks/notifications/lastContentReviewNotificationPlugin.js.map +1 -1
  102. package/plugins/hooks/notifications/reviewers.js +7 -0
  103. package/plugins/hooks/notifications/reviewers.js.map +1 -1
  104. package/plugins/hooks/notifications/sendChangeRequestNotification.js +11 -0
  105. package/plugins/hooks/notifications/sendChangeRequestNotification.js.map +1 -1
  106. package/plugins/hooks/notifications/sendCommentNotification.js +11 -0
  107. package/plugins/hooks/notifications/sendCommentNotification.js.map +1 -1
  108. package/plugins/hooks/notifications/sendContentReviewNotification.js +11 -0
  109. package/plugins/hooks/notifications/sendContentReviewNotification.js.map +1 -1
  110. package/plugins/hooks/updatePendingChangeRequests.js +8 -0
  111. package/plugins/hooks/updatePendingChangeRequests.js.map +1 -1
  112. package/plugins/hooks/updateTotalComments.js +9 -0
  113. package/plugins/hooks/updateTotalComments.js.map +1 -1
  114. package/plugins/hooks/validateChangeRequest.js +16 -0
  115. package/plugins/hooks/validateChangeRequest.js.map +1 -1
  116. package/plugins/hooks/validateComment.js +12 -1
  117. package/plugins/hooks/validateComment.js.map +1 -1
  118. package/plugins/hooks/validateContentReview.js +6 -0
  119. package/plugins/hooks/validateContentReview.js.map +1 -1
  120. package/plugins/pageBuilder/PageApwSettingsGetterPlugin.js +15 -0
  121. package/plugins/pageBuilder/PageApwSettingsGetterPlugin.js.map +1 -1
  122. package/plugins/pageBuilder/apwContentPagePlugins.js +4 -0
  123. package/plugins/pageBuilder/apwContentPagePlugins.js.map +1 -1
  124. package/plugins/pageBuilder/extendPbPageSettingsSchema.js +6 -1
  125. package/plugins/pageBuilder/extendPbPageSettingsSchema.js.map +1 -1
  126. package/plugins/pageBuilder/index.js +11 -0
  127. package/plugins/pageBuilder/index.js.map +1 -1
  128. package/plugins/pageBuilder/linkContentReviewToPage.js +16 -0
  129. package/plugins/pageBuilder/linkContentReviewToPage.js.map +1 -1
  130. package/plugins/pageBuilder/linkWorkflowToPage.js +31 -1
  131. package/plugins/pageBuilder/linkWorkflowToPage.js.map +1 -1
  132. package/plugins/pageBuilder/notifications/changeRequestNotification.js +4 -0
  133. package/plugins/pageBuilder/notifications/changeRequestNotification.js.map +1 -1
  134. package/plugins/pageBuilder/notifications/commentNotification.js +4 -0
  135. package/plugins/pageBuilder/notifications/commentNotification.js.map +1 -1
  136. package/plugins/pageBuilder/notifications/contentReviewNotification.js +4 -0
  137. package/plugins/pageBuilder/notifications/contentReviewNotification.js.map +1 -1
  138. package/plugins/pageBuilder/notifications/contentUrl.js +7 -1
  139. package/plugins/pageBuilder/notifications/contentUrl.js.map +1 -1
  140. package/plugins/pageBuilder/triggerContentReview.js +11 -0
  141. package/plugins/pageBuilder/triggerContentReview.js.map +1 -1
  142. package/plugins/pageBuilder/updateContentReviewStatus.js +12 -0
  143. package/plugins/pageBuilder/updateContentReviewStatus.js.map +1 -1
  144. package/plugins/pageBuilder/utils.js +35 -1
  145. package/plugins/pageBuilder/utils.js.map +1 -1
  146. package/plugins/utils.js +43 -0
  147. package/plugins/utils.js.map +1 -1
  148. package/scheduler/createScheduleActionMethods.js +20 -1
  149. package/scheduler/createScheduleActionMethods.js.map +1 -1
  150. package/scheduler/handlers/executeAction/index.js +33 -9
  151. package/scheduler/handlers/executeAction/index.js.map +1 -1
  152. package/scheduler/handlers/executeAction/plugins/ApplicationGraphQL.js +5 -0
  153. package/scheduler/handlers/executeAction/plugins/ApplicationGraphQL.js.map +1 -1
  154. package/scheduler/handlers/executeAction/plugins/HeadlessCMSGraphQL.js +21 -0
  155. package/scheduler/handlers/executeAction/plugins/HeadlessCMSGraphQL.js.map +1 -1
  156. package/scheduler/handlers/executeAction/plugins/PageBuilderGraphQL.js +27 -4
  157. package/scheduler/handlers/executeAction/plugins/PageBuilderGraphQL.js.map +1 -1
  158. package/scheduler/handlers/executeAction/security.js +11 -0
  159. package/scheduler/handlers/executeAction/security.js.map +1 -1
  160. package/scheduler/handlers/scheduleAction/index.js +25 -5
  161. package/scheduler/handlers/scheduleAction/index.js.map +1 -1
  162. package/scheduler/handlers/scheduleAction/scheduleAction.utils.js +23 -2
  163. package/scheduler/handlers/scheduleAction/scheduleAction.utils.js.map +1 -1
  164. package/scheduler/handlers/utils.js +40 -3
  165. package/scheduler/handlers/utils.js.map +1 -1
  166. package/scheduler/index.js +3 -0
  167. package/scheduler/index.js.map +1 -1
  168. package/scheduler/types.js +6 -0
  169. package/scheduler/types.js.map +1 -1
  170. package/storageOperations/changeRequestStorageOperations.js +19 -0
  171. package/storageOperations/changeRequestStorageOperations.js.map +1 -1
  172. package/storageOperations/commentStorageOperations.js +21 -0
  173. package/storageOperations/commentStorageOperations.js.map +1 -1
  174. package/storageOperations/contentReviewStorageOperations.js +17 -0
  175. package/storageOperations/contentReviewStorageOperations.js.map +1 -1
  176. package/storageOperations/index.js +14 -0
  177. package/storageOperations/index.js.map +1 -1
  178. package/storageOperations/models/changeRequest.model.js +9 -0
  179. package/storageOperations/models/changeRequest.model.js.map +1 -1
  180. package/storageOperations/models/comment.model.js +8 -0
  181. package/storageOperations/models/comment.model.js.map +1 -1
  182. package/storageOperations/models/contentModelPluginFactory.js +5 -0
  183. package/storageOperations/models/contentModelPluginFactory.js.map +1 -1
  184. package/storageOperations/models/contentReview.model.js +26 -0
  185. package/storageOperations/models/contentReview.model.js.map +1 -1
  186. package/storageOperations/models/index.js +24 -2
  187. package/storageOperations/models/index.js.map +1 -1
  188. package/storageOperations/models/reviewer.model.js +8 -0
  189. package/storageOperations/models/reviewer.model.js.map +1 -1
  190. package/storageOperations/models/utils.js +4 -0
  191. package/storageOperations/models/utils.js.map +1 -1
  192. package/storageOperations/models/workflow.model.js +23 -0
  193. package/storageOperations/models/workflow.model.js.map +1 -1
  194. package/storageOperations/reviewerStorageOperations.js +17 -0
  195. package/storageOperations/reviewerStorageOperations.js.map +1 -1
  196. package/storageOperations/workflowStorageOperations.js +19 -0
  197. package/storageOperations/workflowStorageOperations.js.map +1 -1
  198. package/types.js +14 -0
  199. package/types.js.map +1 -1
  200. package/utils/contentApwSettingsPlugin.js +6 -0
  201. package/utils/contentApwSettingsPlugin.js.map +1 -1
  202. package/utils/errors.js +17 -0
  203. package/utils/errors.js.map +1 -1
  204. package/utils/fieldResolver.js +12 -2
  205. package/utils/fieldResolver.js.map +1 -1
  206. package/utils/resolve.js +3 -0
  207. package/utils/resolve.js.map +1 -1
@@ -1,14 +1,21 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.PageBuilderGraphQL = void 0;
9
+
8
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
+
9
12
  var _ApplicationGraphQL = require("./ApplicationGraphQL");
13
+
10
14
  var _types = require("../../../types");
11
- const PB_PAGE_DATA_FIELD = /* GraphQL */`
15
+
16
+ const PB_PAGE_DATA_FIELD =
17
+ /* GraphQL */
18
+ `
12
19
  {
13
20
  id
14
21
  pid
@@ -72,14 +79,18 @@ const PB_PAGE_DATA_FIELD = /* GraphQL */`
72
79
  }
73
80
  }
74
81
  `;
75
- const ERROR_FIELD = /* GraphQL */`
82
+ const ERROR_FIELD =
83
+ /* GraphQL */
84
+ `
76
85
  {
77
86
  code
78
87
  data
79
88
  message
80
89
  }
81
90
  `;
82
- const PUBLISH_MUTATION = /* GraphQL */`
91
+ const PUBLISH_MUTATION =
92
+ /* GraphQL */
93
+ `
83
94
  mutation PublishPage($id: ID!) {
84
95
  pageBuilder {
85
96
  publishPage(id: $id) {
@@ -89,7 +100,9 @@ const PUBLISH_MUTATION = /* GraphQL */`
89
100
  }
90
101
  }
91
102
  `;
92
- const UNPUBLISH_MUTATION = /* GraphQL */`
103
+ const UNPUBLISH_MUTATION =
104
+ /* GraphQL */
105
+ `
93
106
  mutation UnpublishPage($id: ID!) {
94
107
  pageBuilder {
95
108
  unpublishPage(id: $id) {
@@ -99,27 +112,34 @@ const UNPUBLISH_MUTATION = /* GraphQL */`
99
112
  }
100
113
  }
101
114
  `;
115
+
102
116
  class PageBuilderGraphQL extends _ApplicationGraphQL.ApplicationGraphQL {
103
117
  constructor(...args) {
104
118
  super(...args);
105
119
  (0, _defineProperty2.default)(this, "name", "apw.scheduler.applicationGraphQL.pageBuilder");
106
120
  }
121
+
107
122
  canUse(data) {
108
123
  return data.type === _types.ApwContentTypes.PAGE;
109
124
  }
125
+
110
126
  getArn(settings) {
111
127
  return settings.mainGraphqlFunctionArn;
112
128
  }
129
+
113
130
  getGraphQLBody(data) {
114
131
  switch (data.action) {
115
132
  case _types.ApwScheduleActionTypes.PUBLISH:
116
133
  return this.getPublishBody(data);
134
+
117
135
  case _types.ApwScheduleActionTypes.UNPUBLISH:
118
136
  return this.getUnpublishBody(data);
137
+
119
138
  default:
120
139
  return null;
121
140
  }
122
141
  }
142
+
123
143
  getPublishBody(data) {
124
144
  return {
125
145
  query: PUBLISH_MUTATION,
@@ -128,6 +148,7 @@ class PageBuilderGraphQL extends _ApplicationGraphQL.ApplicationGraphQL {
128
148
  }
129
149
  };
130
150
  }
151
+
131
152
  getUnpublishBody(data) {
132
153
  return {
133
154
  query: UNPUBLISH_MUTATION,
@@ -136,5 +157,7 @@ class PageBuilderGraphQL extends _ApplicationGraphQL.ApplicationGraphQL {
136
157
  }
137
158
  };
138
159
  }
160
+
139
161
  }
162
+
140
163
  exports.PageBuilderGraphQL = PageBuilderGraphQL;
@@ -1 +1 @@
1
- {"version":3,"names":["PB_PAGE_DATA_FIELD","ERROR_FIELD","PUBLISH_MUTATION","UNPUBLISH_MUTATION","PageBuilderGraphQL","ApplicationGraphQL","canUse","data","type","ApwContentTypes","PAGE","getArn","settings","mainGraphqlFunctionArn","getGraphQLBody","action","ApwScheduleActionTypes","PUBLISH","getPublishBody","UNPUBLISH","getUnpublishBody","query","variables","id","entryId"],"sources":["PageBuilderGraphQL.ts"],"sourcesContent":["import { ApplicationGraphQL, ApplicationGraphQLBody } from \"./ApplicationGraphQL\";\nimport { ApwContentTypes, ApwScheduleActionData, ApwScheduleActionTypes } from \"~/scheduler/types\";\nimport { ApwSettings } from \"~/scheduler/handlers/utils\";\n\nconst PB_PAGE_DATA_FIELD = /* GraphQL */ `\n {\n id\n pid\n editor\n category {\n slug\n }\n version\n title\n path\n url\n content\n savedOn\n status\n locked\n publishedOn\n locked\n revisions {\n id\n status\n locked\n version\n }\n settings {\n general {\n snippet\n tags\n layout\n image {\n id\n src\n }\n }\n social {\n meta {\n property\n content\n }\n title\n description\n image {\n id\n src\n }\n }\n seo {\n title\n description\n meta {\n name\n content\n }\n }\n }\n createdFrom\n createdOn\n createdBy {\n id\n displayName\n type\n }\n }\n`;\n\nconst ERROR_FIELD = /* GraphQL */ `\n {\n code\n data\n message\n }\n`;\n\nconst PUBLISH_MUTATION = /* GraphQL */ `\n mutation PublishPage($id: ID!) {\n pageBuilder {\n publishPage(id: $id) {\n data ${PB_PAGE_DATA_FIELD}\n error ${ERROR_FIELD}\n }\n }\n }\n`;\n\nconst UNPUBLISH_MUTATION = /* GraphQL */ `\n mutation UnpublishPage($id: ID!) {\n pageBuilder {\n unpublishPage(id: $id) {\n data ${PB_PAGE_DATA_FIELD}\n error ${ERROR_FIELD}\n }\n }\n }\n`;\n\ninterface ApplicationGraphQLBodyVariables {\n id: string;\n}\n\nexport class PageBuilderGraphQL extends ApplicationGraphQL {\n public override name = \"apw.scheduler.applicationGraphQL.pageBuilder\";\n\n public override canUse(data: ApwScheduleActionData): boolean {\n return data.type === ApwContentTypes.PAGE;\n }\n\n public override getArn(settings: ApwSettings): string {\n return settings.mainGraphqlFunctionArn;\n }\n\n public override getGraphQLBody(data: ApwScheduleActionData): ApplicationGraphQLBody | null {\n switch (data.action) {\n case ApwScheduleActionTypes.PUBLISH:\n return this.getPublishBody(data);\n case ApwScheduleActionTypes.UNPUBLISH:\n return this.getUnpublishBody(data);\n default:\n return null;\n }\n }\n\n private getPublishBody(\n data: ApwScheduleActionData\n ): ApplicationGraphQLBody<ApplicationGraphQLBodyVariables> {\n return {\n query: PUBLISH_MUTATION,\n variables: {\n id: data.entryId\n }\n };\n }\n\n private getUnpublishBody(\n data: ApwScheduleActionData\n ): ApplicationGraphQLBody<ApplicationGraphQLBodyVariables> {\n return {\n query: UNPUBLISH_MUTATION,\n variables: {\n id: data.entryId\n }\n };\n }\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAGA,MAAMA,kBAAkB,GAAG,aAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,MAAMC,WAAW,GAAG,aAAe;AACnC;AACA;AACA;AACA;AACA;AACA,CAAC;AAED,MAAMC,gBAAgB,GAAG,aAAe;AACxC;AACA;AACA;AACA,uBAAuBF,kBAAmB;AAC1C,wBAAwBC,WAAY;AACpC;AACA;AACA;AACA,CAAC;AAED,MAAME,kBAAkB,GAAG,aAAe;AAC1C;AACA;AACA;AACA,uBAAuBH,kBAAmB;AAC1C,wBAAwBC,WAAY;AACpC;AACA;AACA;AACA,CAAC;AAMM,MAAMG,kBAAkB,SAASC,sCAAkB,CAAC;EAAA;IAAA;IAAA,4CAChC,8CAA8C;EAAA;EAErDC,MAAM,CAACC,IAA2B,EAAW;IACzD,OAAOA,IAAI,CAACC,IAAI,KAAKC,sBAAe,CAACC,IAAI;EAC7C;EAEgBC,MAAM,CAACC,QAAqB,EAAU;IAClD,OAAOA,QAAQ,CAACC,sBAAsB;EAC1C;EAEgBC,cAAc,CAACP,IAA2B,EAAiC;IACvF,QAAQA,IAAI,CAACQ,MAAM;MACf,KAAKC,6BAAsB,CAACC,OAAO;QAC/B,OAAO,IAAI,CAACC,cAAc,CAACX,IAAI,CAAC;MACpC,KAAKS,6BAAsB,CAACG,SAAS;QACjC,OAAO,IAAI,CAACC,gBAAgB,CAACb,IAAI,CAAC;MACtC;QACI,OAAO,IAAI;IAAC;EAExB;EAEQW,cAAc,CAClBX,IAA2B,EAC4B;IACvD,OAAO;MACHc,KAAK,EAAEnB,gBAAgB;MACvBoB,SAAS,EAAE;QACPC,EAAE,EAAEhB,IAAI,CAACiB;MACb;IACJ,CAAC;EACL;EAEQJ,gBAAgB,CACpBb,IAA2B,EAC4B;IACvD,OAAO;MACHc,KAAK,EAAElB,kBAAkB;MACzBmB,SAAS,EAAE;QACPC,EAAE,EAAEhB,IAAI,CAACiB;MACb;IACJ,CAAC;EACL;AACJ;AAAC"}
1
+ {"version":3,"names":["PB_PAGE_DATA_FIELD","ERROR_FIELD","PUBLISH_MUTATION","UNPUBLISH_MUTATION","PageBuilderGraphQL","ApplicationGraphQL","canUse","data","type","ApwContentTypes","PAGE","getArn","settings","mainGraphqlFunctionArn","getGraphQLBody","action","ApwScheduleActionTypes","PUBLISH","getPublishBody","UNPUBLISH","getUnpublishBody","query","variables","id","entryId"],"sources":["PageBuilderGraphQL.ts"],"sourcesContent":["import { ApplicationGraphQL, ApplicationGraphQLBody } from \"./ApplicationGraphQL\";\nimport { ApwContentTypes, ApwScheduleActionData, ApwScheduleActionTypes } from \"~/scheduler/types\";\nimport { ApwSettings } from \"~/scheduler/handlers/utils\";\n\nconst PB_PAGE_DATA_FIELD = /* GraphQL */ `\n {\n id\n pid\n editor\n category {\n slug\n }\n version\n title\n path\n url\n content\n savedOn\n status\n locked\n publishedOn\n locked\n revisions {\n id\n status\n locked\n version\n }\n settings {\n general {\n snippet\n tags\n layout\n image {\n id\n src\n }\n }\n social {\n meta {\n property\n content\n }\n title\n description\n image {\n id\n src\n }\n }\n seo {\n title\n description\n meta {\n name\n content\n }\n }\n }\n createdFrom\n createdOn\n createdBy {\n id\n displayName\n type\n }\n }\n`;\n\nconst ERROR_FIELD = /* GraphQL */ `\n {\n code\n data\n message\n }\n`;\n\nconst PUBLISH_MUTATION = /* GraphQL */ `\n mutation PublishPage($id: ID!) {\n pageBuilder {\n publishPage(id: $id) {\n data ${PB_PAGE_DATA_FIELD}\n error ${ERROR_FIELD}\n }\n }\n }\n`;\n\nconst UNPUBLISH_MUTATION = /* GraphQL */ `\n mutation UnpublishPage($id: ID!) {\n pageBuilder {\n unpublishPage(id: $id) {\n data ${PB_PAGE_DATA_FIELD}\n error ${ERROR_FIELD}\n }\n }\n }\n`;\n\ninterface ApplicationGraphQLBodyVariables {\n id: string;\n}\n\nexport class PageBuilderGraphQL extends ApplicationGraphQL {\n public override name = \"apw.scheduler.applicationGraphQL.pageBuilder\";\n\n public override canUse(data: ApwScheduleActionData): boolean {\n return data.type === ApwContentTypes.PAGE;\n }\n\n public override getArn(settings: ApwSettings): string {\n return settings.mainGraphqlFunctionArn;\n }\n\n public override getGraphQLBody(data: ApwScheduleActionData): ApplicationGraphQLBody | null {\n switch (data.action) {\n case ApwScheduleActionTypes.PUBLISH:\n return this.getPublishBody(data);\n case ApwScheduleActionTypes.UNPUBLISH:\n return this.getUnpublishBody(data);\n default:\n return null;\n }\n }\n\n private getPublishBody(\n data: ApwScheduleActionData\n ): ApplicationGraphQLBody<ApplicationGraphQLBodyVariables> {\n return {\n query: PUBLISH_MUTATION,\n variables: {\n id: data.entryId\n }\n };\n }\n\n private getUnpublishBody(\n data: ApwScheduleActionData\n ): ApplicationGraphQLBody<ApplicationGraphQLBodyVariables> {\n return {\n query: UNPUBLISH_MUTATION,\n variables: {\n id: data.entryId\n }\n };\n }\n}\n"],"mappings":";;;;;;;;;;;AAAA;;AACA;;AAGA,MAAMA,kBAAkB;AAAG;AAAe;AAC1C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CA/DA;AAiEA,MAAMC,WAAW;AAAG;AAAe;AACnC;AACA;AACA;AACA;AACA;AACA,CANA;AAQA,MAAMC,gBAAgB;AAAG;AAAe;AACxC;AACA;AACA;AACA,uBAAuBF,kBAAmB;AAC1C,wBAAwBC,WAAY;AACpC;AACA;AACA;AACA,CATA;AAWA,MAAME,kBAAkB;AAAG;AAAe;AAC1C;AACA;AACA;AACA,uBAAuBH,kBAAmB;AAC1C,wBAAwBC,WAAY;AACpC;AACA;AACA;AACA,CATA;;AAeO,MAAMG,kBAAN,SAAiCC,sCAAjC,CAAoD;EAAA;IAAA;IAAA,4CAChC,8CADgC;EAAA;;EAGvCC,MAAM,CAACC,IAAD,EAAuC;IACzD,OAAOA,IAAI,CAACC,IAAL,KAAcC,sBAAA,CAAgBC,IAArC;EACH;;EAEeC,MAAM,CAACC,QAAD,EAAgC;IAClD,OAAOA,QAAQ,CAACC,sBAAhB;EACH;;EAEeC,cAAc,CAACP,IAAD,EAA6D;IACvF,QAAQA,IAAI,CAACQ,MAAb;MACI,KAAKC,6BAAA,CAAuBC,OAA5B;QACI,OAAO,KAAKC,cAAL,CAAoBX,IAApB,CAAP;;MACJ,KAAKS,6BAAA,CAAuBG,SAA5B;QACI,OAAO,KAAKC,gBAAL,CAAsBb,IAAtB,CAAP;;MACJ;QACI,OAAO,IAAP;IANR;EAQH;;EAEOW,cAAc,CAClBX,IADkB,EAEqC;IACvD,OAAO;MACHc,KAAK,EAAEnB,gBADJ;MAEHoB,SAAS,EAAE;QACPC,EAAE,EAAEhB,IAAI,CAACiB;MADF;IAFR,CAAP;EAMH;;EAEOJ,gBAAgB,CACpBb,IADoB,EAEmC;IACvD,OAAO;MACHc,KAAK,EAAElB,kBADJ;MAEHmB,SAAS,EAAE;QACPC,EAAE,EAAEhB,IAAI,CAACiB;MADF;IAFR,CAAP;EAMH;;AA1CsD"}
@@ -4,8 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.createCustomAuth = void 0;
7
+
7
8
  var _api = require("@webiny/api");
9
+
8
10
  var _utils = require("../utils");
11
+
9
12
  const createCustomAuth = ({
10
13
  storageOperations
11
14
  }) => {
@@ -17,6 +20,7 @@ const createCustomAuth = ({
17
20
  if (!token.startsWith(_utils.TOKEN_PREFIX)) {
18
21
  return null;
19
22
  }
23
+
20
24
  const {
21
25
  id,
22
26
  tenant,
@@ -25,12 +29,15 @@ const createCustomAuth = ({
25
29
  /**
26
30
  * No point in going further if any piece of information is missing.
27
31
  */
32
+
28
33
  if (!id || !tenant || !locale) {
29
34
  return null;
30
35
  }
31
36
  /**
32
37
  * We must verify that action we are trying to execute actually exists.
33
38
  */
39
+
40
+
34
41
  const item = await storageOperations.get({
35
42
  where: {
36
43
  id,
@@ -38,9 +45,11 @@ const createCustomAuth = ({
38
45
  locale
39
46
  }
40
47
  });
48
+
41
49
  if (!item) {
42
50
  return null;
43
51
  }
52
+
44
53
  hasApwToken = true;
45
54
  return item.createdBy;
46
55
  });
@@ -48,10 +57,12 @@ const createCustomAuth = ({
48
57
  if (!hasApwToken) {
49
58
  return null;
50
59
  }
60
+
51
61
  return [{
52
62
  name: "*"
53
63
  }];
54
64
  });
55
65
  });
56
66
  };
67
+
57
68
  exports.createCustomAuth = createCustomAuth;
@@ -1 +1 @@
1
- {"version":3,"names":["createCustomAuth","storageOperations","ContextPlugin","security","hasApwToken","addAuthenticator","token","startsWith","TOKEN_PREFIX","id","tenant","locale","decodeToken","item","get","where","createdBy","addAuthorizer","name"],"sources":["security.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { CreateApwContextParams } from \"~/scheduler/types\";\nimport { decodeToken, TOKEN_PREFIX } from \"~/scheduler/handlers/utils\";\nimport { ApwContext } from \"~/types\";\n\nexport const createCustomAuth = ({ storageOperations }: CreateApwContextParams) => {\n return new ContextPlugin<ApwContext>(({ security }) => {\n let hasApwToken = false;\n\n security.addAuthenticator(async token => {\n if (!token.startsWith(TOKEN_PREFIX)) {\n return null;\n }\n\n const { id, tenant, locale } = decodeToken(token);\n /**\n * No point in going further if any piece of information is missing.\n */\n if (!id || !tenant || !locale) {\n return null;\n }\n /**\n * We must verify that action we are trying to execute actually exists.\n */\n const item = await storageOperations.get({\n where: {\n id,\n tenant,\n locale\n }\n });\n\n if (!item) {\n return null;\n }\n\n hasApwToken = true;\n\n return item.createdBy;\n });\n\n security.addAuthorizer(async () => {\n if (!hasApwToken) {\n return null;\n }\n return [{ name: \"*\" }];\n });\n });\n};\n"],"mappings":";;;;;;AAAA;AAEA;AAGO,MAAMA,gBAAgB,GAAG,CAAC;EAAEC;AAA0C,CAAC,KAAK;EAC/E,OAAO,IAAIC,kBAAa,CAAa,CAAC;IAAEC;EAAS,CAAC,KAAK;IACnD,IAAIC,WAAW,GAAG,KAAK;IAEvBD,QAAQ,CAACE,gBAAgB,CAAC,MAAMC,KAAK,IAAI;MACrC,IAAI,CAACA,KAAK,CAACC,UAAU,CAACC,mBAAY,CAAC,EAAE;QACjC,OAAO,IAAI;MACf;MAEA,MAAM;QAAEC,EAAE;QAAEC,MAAM;QAAEC;MAAO,CAAC,GAAG,IAAAC,kBAAW,EAACN,KAAK,CAAC;MACjD;AACZ;AACA;MACY,IAAI,CAACG,EAAE,IAAI,CAACC,MAAM,IAAI,CAACC,MAAM,EAAE;QAC3B,OAAO,IAAI;MACf;MACA;AACZ;AACA;MACY,MAAME,IAAI,GAAG,MAAMZ,iBAAiB,CAACa,GAAG,CAAC;QACrCC,KAAK,EAAE;UACHN,EAAE;UACFC,MAAM;UACNC;QACJ;MACJ,CAAC,CAAC;MAEF,IAAI,CAACE,IAAI,EAAE;QACP,OAAO,IAAI;MACf;MAEAT,WAAW,GAAG,IAAI;MAElB,OAAOS,IAAI,CAACG,SAAS;IACzB,CAAC,CAAC;IAEFb,QAAQ,CAACc,aAAa,CAAC,YAAY;MAC/B,IAAI,CAACb,WAAW,EAAE;QACd,OAAO,IAAI;MACf;MACA,OAAO,CAAC;QAAEc,IAAI,EAAE;MAAI,CAAC,CAAC;IAC1B,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAAC"}
1
+ {"version":3,"names":["createCustomAuth","storageOperations","ContextPlugin","security","hasApwToken","addAuthenticator","token","startsWith","TOKEN_PREFIX","id","tenant","locale","decodeToken","item","get","where","createdBy","addAuthorizer","name"],"sources":["security.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { CreateApwContextParams } from \"~/scheduler/types\";\nimport { decodeToken, TOKEN_PREFIX } from \"~/scheduler/handlers/utils\";\nimport { ApwContext } from \"~/types\";\n\nexport const createCustomAuth = ({ storageOperations }: CreateApwContextParams) => {\n return new ContextPlugin<ApwContext>(({ security }) => {\n let hasApwToken = false;\n\n security.addAuthenticator(async token => {\n if (!token.startsWith(TOKEN_PREFIX)) {\n return null;\n }\n\n const { id, tenant, locale } = decodeToken(token);\n /**\n * No point in going further if any piece of information is missing.\n */\n if (!id || !tenant || !locale) {\n return null;\n }\n /**\n * We must verify that action we are trying to execute actually exists.\n */\n const item = await storageOperations.get({\n where: {\n id,\n tenant,\n locale\n }\n });\n\n if (!item) {\n return null;\n }\n\n hasApwToken = true;\n\n return item.createdBy;\n });\n\n security.addAuthorizer(async () => {\n if (!hasApwToken) {\n return null;\n }\n return [{ name: \"*\" }];\n });\n });\n};\n"],"mappings":";;;;;;;AAAA;;AAEA;;AAGO,MAAMA,gBAAgB,GAAG,CAAC;EAAEC;AAAF,CAAD,KAAmD;EAC/E,OAAO,IAAIC,kBAAJ,CAA8B,CAAC;IAAEC;EAAF,CAAD,KAAkB;IACnD,IAAIC,WAAW,GAAG,KAAlB;IAEAD,QAAQ,CAACE,gBAAT,CAA0B,MAAMC,KAAN,IAAe;MACrC,IAAI,CAACA,KAAK,CAACC,UAAN,CAAiBC,mBAAjB,CAAL,EAAqC;QACjC,OAAO,IAAP;MACH;;MAED,MAAM;QAAEC,EAAF;QAAMC,MAAN;QAAcC;MAAd,IAAyB,IAAAC,kBAAA,EAAYN,KAAZ,CAA/B;MACA;AACZ;AACA;;MACY,IAAI,CAACG,EAAD,IAAO,CAACC,MAAR,IAAkB,CAACC,MAAvB,EAA+B;QAC3B,OAAO,IAAP;MACH;MACD;AACZ;AACA;;;MACY,MAAME,IAAI,GAAG,MAAMZ,iBAAiB,CAACa,GAAlB,CAAsB;QACrCC,KAAK,EAAE;UACHN,EADG;UAEHC,MAFG;UAGHC;QAHG;MAD8B,CAAtB,CAAnB;;MAQA,IAAI,CAACE,IAAL,EAAW;QACP,OAAO,IAAP;MACH;;MAEDT,WAAW,GAAG,IAAd;MAEA,OAAOS,IAAI,CAACG,SAAZ;IACH,CA9BD;IAgCAb,QAAQ,CAACc,aAAT,CAAuB,YAAY;MAC/B,IAAI,CAACb,WAAL,EAAkB;QACd,OAAO,IAAP;MACH;;MACD,OAAO,CAAC;QAAEc,IAAI,EAAE;MAAR,CAAD,CAAP;IACH,CALD;EAMH,CAzCM,CAAP;AA0CH,CA3CM"}
@@ -1,27 +1,35 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.scheduleActionHandlerPlugins = exports.InvocationTypes = void 0;
9
+
8
10
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
11
+
9
12
  var _utils = require("../utils");
13
+
10
14
  var _scheduleAction = require("./scheduleAction.utils");
15
+
11
16
  var _handlerAws = require("@webiny/handler-aws");
17
+
12
18
  /**
13
19
  * This logic/file should be moved somewhere else as it is relying on AWS specific stuff.
14
20
  */
15
21
  let InvocationTypes;
16
22
  exports.InvocationTypes = InvocationTypes;
23
+
17
24
  (function (InvocationTypes) {
18
25
  InvocationTypes["SCHEDULED"] = "scheduled";
19
26
  })(InvocationTypes || (exports.InvocationTypes = InvocationTypes = {}));
20
- const log = console.log;
21
27
 
28
+ const log = console.log;
22
29
  /**
23
30
  * Handler that creates a cloudwatch event rule for the schedule action workflow.
24
31
  */
32
+
25
33
  const createScheduleActionLambda = params => {
26
34
  const {
27
35
  cwClient: cloudWatchEventClient,
@@ -42,6 +50,7 @@ const createScheduleActionLambda = params => {
42
50
  /**
43
51
  * If invocationType is "scheduled", execute the action.
44
52
  */
53
+
45
54
  if (invocationType === InvocationTypes.SCHEDULED) {
46
55
  await (0, _scheduleAction.executeTask)({
47
56
  args: payload,
@@ -50,20 +59,21 @@ const createScheduleActionLambda = params => {
50
59
  storageOperations
51
60
  });
52
61
  }
53
-
54
62
  /**
55
63
  * Get current scheduled task from the DB.
56
64
  */
65
+
66
+
57
67
  const currentTask = await storageOperations.getCurrentTask({
58
68
  where: {
59
69
  tenant,
60
70
  locale
61
71
  }
62
72
  });
63
-
64
73
  /**
65
74
  * Get next task from the DB.
66
75
  */
76
+
67
77
  const [[nextItem]] = await storageOperations.list({
68
78
  where: {
69
79
  tenant,
@@ -72,24 +82,30 @@ const createScheduleActionLambda = params => {
72
82
  sort: ["datetime_ASC"],
73
83
  limit: 1
74
84
  });
85
+
75
86
  if (!nextItem) {
76
87
  log(`No item found.`);
77
88
  return;
78
89
  }
90
+
79
91
  const nextTaskDatetime = nextItem.data.datetime;
80
92
  const currentTaskDatetime = currentTask && currentTask.data.datetime;
93
+
81
94
  if ((0, _utils.isDateTimeInNextCentury)(nextTaskDatetime)) {
82
95
  log(`Already processed the task.`);
83
96
  return;
84
97
  }
98
+
85
99
  if (!(0, _scheduleAction.shouldScheduleTask)(nextTaskDatetime, currentTaskDatetime)) {
86
100
  log(`Already scheduled the task.`);
87
101
  return;
88
102
  }
103
+
89
104
  const futureDatetime = (0, _utils.moveDateTimeToNextCentury)(nextItem.data.datetime);
90
105
  /**
91
106
  * Update "datetime" to a future date to mark it as scheduled.
92
107
  */
108
+
93
109
  log(`Update task's datetime to `, futureDatetime);
94
110
  await storageOperations.update({
95
111
  item: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, nextItem), {}, {
@@ -104,6 +120,7 @@ const createScheduleActionLambda = params => {
104
120
  /**
105
121
  * Restore "datetime" of current task so that it can be schedule in next cycle.
106
122
  */
123
+
107
124
  if (currentTaskDatetime && (0, _utils.shouldRestoreDatetime)({
108
125
  invocationType,
109
126
  datetime: currentTaskDatetime
@@ -118,6 +135,8 @@ const createScheduleActionLambda = params => {
118
135
  /**
119
136
  * Schedule Lambda
120
137
  */
138
+
139
+
121
140
  log(`Schedule Lambda Execution...`);
122
141
  await (0, _scheduleAction.scheduleLambdaExecution)({
123
142
  cloudWatchEventClient,
@@ -130,15 +149,16 @@ const createScheduleActionLambda = params => {
130
149
  /**
131
150
  * Update current task.
132
151
  */
152
+
133
153
  await storageOperations.updateCurrentTask({
134
154
  item: nextItem
135
155
  });
136
156
  } catch (ex) {
137
- log("[HANDLER_CREATE_RULE] Error => ", ex);
138
- // TODO: Handler error. Maybe save it into DB.
157
+ log("[HANDLER_CREATE_RULE] Error => ", ex); // TODO: Handler error. Maybe save it into DB.
139
158
  }
140
159
  });
141
160
  };
142
161
 
143
162
  const scheduleActionHandlerPlugins = config => [(0, _utils.basePlugins)(), createScheduleActionLambda(config)];
163
+
144
164
  exports.scheduleActionHandlerPlugins = scheduleActionHandlerPlugins;
@@ -1 +1 @@
1
- {"version":3,"names":["InvocationTypes","log","console","createScheduleActionLambda","params","cwClient","cloudWatchEventClient","storageOperations","handlers","createRawEventHandler","payload","context","lambdaContext","eventContext","locale","tenant","invocationType","SCHEDULED","executeTask","args","lambdaName","executeAction","handlerClient","currentTask","getCurrentTask","where","nextItem","list","sort","limit","nextTaskDatetime","data","datetime","currentTaskDatetime","isDateTimeInNextCentury","shouldScheduleTask","futureDatetime","moveDateTimeToNextCentury","update","item","input","shouldRestoreDatetime","restoreDateTime","task","scheduleLambdaExecution","invokedFunctionArn","updateCurrentTask","ex","scheduleActionHandlerPlugins","config","basePlugins"],"sources":["index.ts"],"sourcesContent":["/**\n * This logic/file should be moved somewhere else as it is relying on AWS specific stuff.\n */\nimport { ApwScheduleActionStorageOperations } from \"~/scheduler/types\";\nimport {\n isDateTimeInNextCentury,\n moveDateTimeToNextCentury,\n shouldRestoreDatetime,\n basePlugins\n} from \"~/scheduler/handlers/utils\";\nimport {\n executeTask,\n shouldScheduleTask,\n restoreDateTime,\n scheduleLambdaExecution\n} from \"./scheduleAction.utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\nexport enum InvocationTypes {\n SCHEDULED = \"scheduled\"\n}\n\nexport interface HandlerArgs {\n datetime: string;\n tenant: string;\n locale: string;\n invocationType?: InvocationTypes;\n futureDatetime?: string;\n}\n\nexport interface Configuration {\n cwClient: any;\n storageOperations: ApwScheduleActionStorageOperations;\n handlers: {\n executeAction: string;\n };\n}\n\nconst log = console.log;\n\n/**\n * Handler that creates a cloudwatch event rule for the schedule action workflow.\n */\nconst createScheduleActionLambda = (params: Configuration) => {\n const { cwClient: cloudWatchEventClient, storageOperations, handlers } = params;\n\n return createRawEventHandler<HandlerArgs>(\n async ({ payload, context, lambdaContext: eventContext }) => {\n try {\n const { locale, tenant, invocationType } = payload;\n /**\n * If invocationType is \"scheduled\", execute the action.\n */\n if (invocationType === InvocationTypes.SCHEDULED) {\n await executeTask({\n args: payload,\n lambdaName: handlers.executeAction,\n handlerClient: context.handlerClient,\n storageOperations\n });\n }\n\n /**\n * Get current scheduled task from the DB.\n */\n const currentTask = await storageOperations.getCurrentTask({\n where: {\n tenant,\n locale\n }\n });\n\n /**\n * Get next task from the DB.\n */\n const [[nextItem]] = await storageOperations.list({\n where: {\n tenant,\n locale\n },\n sort: [\"datetime_ASC\"],\n limit: 1\n });\n\n if (!nextItem) {\n log(`No item found.`);\n return;\n }\n\n const nextTaskDatetime = nextItem.data.datetime;\n const currentTaskDatetime = currentTask && currentTask.data.datetime;\n\n if (isDateTimeInNextCentury(nextTaskDatetime)) {\n log(`Already processed the task.`);\n return;\n }\n\n if (!shouldScheduleTask(nextTaskDatetime, currentTaskDatetime)) {\n log(`Already scheduled the task.`);\n return;\n }\n\n const futureDatetime = moveDateTimeToNextCentury(nextItem.data.datetime);\n /**\n * Update \"datetime\" to a future date to mark it as scheduled.\n */\n log(`Update task's datetime to `, futureDatetime);\n await storageOperations.update({\n item: {\n ...nextItem,\n data: { ...nextItem.data, datetime: futureDatetime }\n },\n input: { ...nextItem.data, datetime: futureDatetime }\n });\n /**\n * Restore \"datetime\" of current task so that it can be schedule in next cycle.\n */\n if (\n currentTaskDatetime &&\n shouldRestoreDatetime({\n invocationType,\n datetime: currentTaskDatetime\n })\n ) {\n await restoreDateTime({\n tenant,\n locale,\n task: currentTask,\n storageOperations\n });\n }\n /**\n * Schedule Lambda\n */\n log(`Schedule Lambda Execution...`);\n await scheduleLambdaExecution({\n cloudWatchEventClient,\n invokedFunctionArn: eventContext.invokedFunctionArn,\n datetime: nextItem.data.datetime,\n futureDatetime: futureDatetime,\n tenant,\n locale\n });\n /**\n * Update current task.\n */\n await storageOperations.updateCurrentTask({ item: nextItem });\n } catch (ex) {\n log(\"[HANDLER_CREATE_RULE] Error => \", ex);\n // TODO: Handler error. Maybe save it into DB.\n }\n }\n );\n};\n\nexport const scheduleActionHandlerPlugins = (config: Configuration) => [\n basePlugins(),\n createScheduleActionLambda(config)\n];\n"],"mappings":"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"}
1
+ {"version":3,"names":["InvocationTypes","log","console","createScheduleActionLambda","params","cwClient","cloudWatchEventClient","storageOperations","handlers","createRawEventHandler","payload","context","lambdaContext","eventContext","locale","tenant","invocationType","SCHEDULED","executeTask","args","lambdaName","executeAction","handlerClient","currentTask","getCurrentTask","where","nextItem","list","sort","limit","nextTaskDatetime","data","datetime","currentTaskDatetime","isDateTimeInNextCentury","shouldScheduleTask","futureDatetime","moveDateTimeToNextCentury","update","item","input","shouldRestoreDatetime","restoreDateTime","task","scheduleLambdaExecution","invokedFunctionArn","updateCurrentTask","ex","scheduleActionHandlerPlugins","config","basePlugins"],"sources":["index.ts"],"sourcesContent":["/**\n * This logic/file should be moved somewhere else as it is relying on AWS specific stuff.\n */\nimport { ApwScheduleActionStorageOperations } from \"~/scheduler/types\";\nimport {\n isDateTimeInNextCentury,\n moveDateTimeToNextCentury,\n shouldRestoreDatetime,\n basePlugins\n} from \"~/scheduler/handlers/utils\";\nimport {\n executeTask,\n shouldScheduleTask,\n restoreDateTime,\n scheduleLambdaExecution\n} from \"./scheduleAction.utils\";\nimport { createRawEventHandler } from \"@webiny/handler-aws\";\n\nexport enum InvocationTypes {\n SCHEDULED = \"scheduled\"\n}\n\nexport interface HandlerArgs {\n datetime: string;\n tenant: string;\n locale: string;\n invocationType?: InvocationTypes;\n futureDatetime?: string;\n}\n\nexport interface Configuration {\n cwClient: any;\n storageOperations: ApwScheduleActionStorageOperations;\n handlers: {\n executeAction: string;\n };\n}\n\nconst log = console.log;\n\n/**\n * Handler that creates a cloudwatch event rule for the schedule action workflow.\n */\nconst createScheduleActionLambda = (params: Configuration) => {\n const { cwClient: cloudWatchEventClient, storageOperations, handlers } = params;\n\n return createRawEventHandler<HandlerArgs>(\n async ({ payload, context, lambdaContext: eventContext }) => {\n try {\n const { locale, tenant, invocationType } = payload;\n /**\n * If invocationType is \"scheduled\", execute the action.\n */\n if (invocationType === InvocationTypes.SCHEDULED) {\n await executeTask({\n args: payload,\n lambdaName: handlers.executeAction,\n handlerClient: context.handlerClient,\n storageOperations\n });\n }\n\n /**\n * Get current scheduled task from the DB.\n */\n const currentTask = await storageOperations.getCurrentTask({\n where: {\n tenant,\n locale\n }\n });\n\n /**\n * Get next task from the DB.\n */\n const [[nextItem]] = await storageOperations.list({\n where: {\n tenant,\n locale\n },\n sort: [\"datetime_ASC\"],\n limit: 1\n });\n\n if (!nextItem) {\n log(`No item found.`);\n return;\n }\n\n const nextTaskDatetime = nextItem.data.datetime;\n const currentTaskDatetime = currentTask && currentTask.data.datetime;\n\n if (isDateTimeInNextCentury(nextTaskDatetime)) {\n log(`Already processed the task.`);\n return;\n }\n\n if (!shouldScheduleTask(nextTaskDatetime, currentTaskDatetime)) {\n log(`Already scheduled the task.`);\n return;\n }\n\n const futureDatetime = moveDateTimeToNextCentury(nextItem.data.datetime);\n /**\n * Update \"datetime\" to a future date to mark it as scheduled.\n */\n log(`Update task's datetime to `, futureDatetime);\n await storageOperations.update({\n item: {\n ...nextItem,\n data: { ...nextItem.data, datetime: futureDatetime }\n },\n input: { ...nextItem.data, datetime: futureDatetime }\n });\n /**\n * Restore \"datetime\" of current task so that it can be schedule in next cycle.\n */\n if (\n currentTaskDatetime &&\n shouldRestoreDatetime({\n invocationType,\n datetime: currentTaskDatetime\n })\n ) {\n await restoreDateTime({\n tenant,\n locale,\n task: currentTask,\n storageOperations\n });\n }\n /**\n * Schedule Lambda\n */\n log(`Schedule Lambda Execution...`);\n await scheduleLambdaExecution({\n cloudWatchEventClient,\n invokedFunctionArn: eventContext.invokedFunctionArn,\n datetime: nextItem.data.datetime,\n futureDatetime: futureDatetime,\n tenant,\n locale\n });\n /**\n * Update current task.\n */\n await storageOperations.updateCurrentTask({ item: nextItem });\n } catch (ex) {\n log(\"[HANDLER_CREATE_RULE] Error => \", ex);\n // TODO: Handler error. Maybe save it into DB.\n }\n }\n );\n};\n\nexport const scheduleActionHandlerPlugins = (config: Configuration) => [\n basePlugins(),\n createScheduleActionLambda(config)\n];\n"],"mappings":"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"}
@@ -1,17 +1,24 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports.restoreDateTime = exports.executeTask = void 0;
8
9
  exports.scheduleLambdaExecution = scheduleLambdaExecution;
9
10
  exports.shouldScheduleTask = void 0;
11
+
10
12
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
13
+
11
14
  var _utils = require("../utils");
15
+
12
16
  var _index = require("./index");
17
+
13
18
  var _clientCloudwatchEvents = require("@aws-sdk/client-cloudwatch-events");
19
+
14
20
  const log = console.log;
21
+
15
22
  /**
16
23
  * Current API limit/quota for Cloudwatch events is sufficient for now. But, we should watch for it;
17
24
  * in case of scheduling becoming the most frequently used feature.
@@ -32,6 +39,7 @@ async function scheduleLambdaExecution({
32
39
  /**
33
40
  * Remove the target
34
41
  */
42
+
35
43
  const removeTargetsCommand = new _clientCloudwatchEvents.RemoveTargetsCommand({
36
44
  Rule: eventRuleName,
37
45
  Ids: [eventTargetId]
@@ -40,6 +48,7 @@ async function scheduleLambdaExecution({
40
48
  /**
41
49
  * Log error.
42
50
  */
51
+
43
52
  if (typeof removeTargetsResponse.FailedEntryCount === "number" && removeTargetsResponse.FailedEntryCount !== 0) {
44
53
  console.info("Failed in removing the targets!");
45
54
  console.info(removeTargetsResponse.FailedEntries);
@@ -47,16 +56,18 @@ async function scheduleLambdaExecution({
47
56
  /**
48
57
  * Delete the Rule
49
58
  */
59
+
60
+
50
61
  const deleteRuleCommand = new _clientCloudwatchEvents.DeleteRuleCommand({
51
62
  Name: eventRuleName
52
63
  });
53
64
  await cloudWatchEventClient.send(deleteRuleCommand);
54
-
55
65
  /**
56
66
  * Create a new one.
57
67
  * Min H D M DW Y
58
68
  * 20 10 10 03 * 2022
59
69
  */
70
+
60
71
  const cronExpression = (0, _utils.dateTimeToCronExpression)(datetime);
61
72
  const ruleParams = {
62
73
  Name: eventRuleName,
@@ -68,6 +79,7 @@ async function scheduleLambdaExecution({
68
79
  /**
69
80
  * Add lambda as target for the rule.
70
81
  */
82
+
71
83
  await cloudWatchEventClient.send(new _clientCloudwatchEvents.PutTargetsCommand({
72
84
  Rule: eventRuleName,
73
85
  Targets: [{
@@ -83,10 +95,13 @@ async function scheduleLambdaExecution({
83
95
  }]
84
96
  }));
85
97
  }
98
+
86
99
  const shouldScheduleTask = (nextTaskDatetime, currentTaskDatetime) => {
87
100
  return !currentTaskDatetime || nextTaskDatetime < currentTaskDatetime;
88
101
  };
102
+
89
103
  exports.shouldScheduleTask = shouldScheduleTask;
104
+
90
105
  const restoreDateTime = async ({
91
106
  locale,
92
107
  tenant,
@@ -101,6 +116,7 @@ const restoreDateTime = async ({
101
116
  id: currentTask.id
102
117
  }
103
118
  });
119
+
104
120
  if (item) {
105
121
  const newDateTime = (0, _utils.moveDateTimeToCurrentCentury)(item.data.datetime);
106
122
  await storageOperations.update({
@@ -115,7 +131,9 @@ const restoreDateTime = async ({
115
131
  });
116
132
  }
117
133
  };
134
+
118
135
  exports.restoreDateTime = restoreDateTime;
136
+
119
137
  const executeTask = async ({
120
138
  args,
121
139
  lambdaName,
@@ -123,6 +141,7 @@ const executeTask = async ({
123
141
  storageOperations
124
142
  }) => {
125
143
  log(`Executing task at: `, new Date().toISOString());
144
+
126
145
  if (typeof handlerClient.invoke === "function") {
127
146
  await handlerClient.invoke({
128
147
  name: lambdaName,
@@ -135,10 +154,11 @@ const executeTask = async ({
135
154
  await: false
136
155
  });
137
156
  }
138
-
139
157
  /**
140
158
  * Delete current schedule Task. So that, we can schedule a new one later.
141
159
  */
160
+
161
+
142
162
  try {
143
163
  await storageOperations.deleteCurrentTask({
144
164
  tenant: args.tenant,
@@ -148,4 +168,5 @@ const executeTask = async ({
148
168
  console.error(e);
149
169
  }
150
170
  };
171
+
151
172
  exports.executeTask = executeTask;
@@ -1 +1 @@
1
- {"version":3,"names":["log","console","scheduleLambdaExecution","cloudWatchEventClient","invokedFunctionArn","datetime","futureDatetime","tenant","locale","eventTargetId","eventRuleName","getApwSettings","removeTargetsCommand","RemoveTargetsCommand","Rule","Ids","removeTargetsResponse","send","FailedEntryCount","info","FailedEntries","deleteRuleCommand","DeleteRuleCommand","Name","cronExpression","dateTimeToCronExpression","ruleParams","ScheduleExpression","State","Description","PutRuleCommand","PutTargetsCommand","Targets","Arn","Id","Input","JSON","stringify","invocationType","InvocationTypes","SCHEDULED","shouldScheduleTask","nextTaskDatetime","currentTaskDatetime","restoreDateTime","task","currentTask","storageOperations","id","item","get","where","newDateTime","moveDateTimeToCurrentCentury","data","update","input","executeTask","args","lambdaName","handlerClient","Date","toISOString","invoke","name","payload","await","deleteCurrentTask","e","error"],"sources":["scheduleAction.utils.ts"],"sourcesContent":["import { dateTimeToCronExpression, moveDateTimeToCurrentCentury } from \"~/scheduler/handlers/utils\";\nimport { ApwScheduleAction } from \"~/scheduler/types\";\nimport {\n HandlerArgs,\n InvocationTypes,\n Configuration\n} from \"~/scheduler/handlers/scheduleAction/index\";\nimport {\n DeleteRuleCommand,\n RemoveTargetsCommand,\n PutTargetsCommand,\n PutRuleCommand\n} from \"@aws-sdk/client-cloudwatch-events\";\nimport { ClientContext } from \"@webiny/handler-client/types\";\nimport { getApwSettings } from \"~/scheduler/handlers/utils\";\n\nconst log = console.log;\n\ninterface ScheduleLambdaExecutionParams extends Omit<HandlerArgs, \"invocationType\"> {\n cloudWatchEventClient: any;\n invokedFunctionArn: string;\n}\n\n/**\n * Current API limit/quota for Cloudwatch events is sufficient for now. But, we should watch for it;\n * in case of scheduling becoming the most frequently used feature.\n * https://aws.amazon.com/about-aws/whats-new/2017/07/cloudwatch-events-increases-rules-and-api-requests-limits/\n */\nexport async function scheduleLambdaExecution({\n cloudWatchEventClient,\n invokedFunctionArn,\n datetime,\n futureDatetime,\n tenant,\n locale\n}: ScheduleLambdaExecutionParams) {\n const { eventTargetId, eventRuleName } = await getApwSettings();\n /**\n * Remove the target\n */\n const removeTargetsCommand = new RemoveTargetsCommand({\n Rule: eventRuleName,\n Ids: [eventTargetId]\n });\n const removeTargetsResponse = await cloudWatchEventClient.send(removeTargetsCommand);\n /**\n * Log error.\n */\n if (\n typeof removeTargetsResponse.FailedEntryCount === \"number\" &&\n removeTargetsResponse.FailedEntryCount !== 0\n ) {\n console.info(\"Failed in removing the targets!\");\n console.info(removeTargetsResponse.FailedEntries);\n }\n /**\n * Delete the Rule\n */\n const deleteRuleCommand = new DeleteRuleCommand({\n Name: eventRuleName\n });\n await cloudWatchEventClient.send(deleteRuleCommand);\n\n /**\n * Create a new one.\n * Min H D M DW Y\n * 20 10 10 03 * 2022\n */\n const cronExpression = dateTimeToCronExpression(datetime);\n\n const ruleParams = {\n Name: eventRuleName,\n ScheduleExpression: `cron(${cronExpression})`,\n State: \"ENABLED\",\n Description: `Enable us to schedule an action in publishing workflow at a particular datetime`\n };\n\n await cloudWatchEventClient.send(new PutRuleCommand(ruleParams));\n /**\n * Add lambda as target for the rule.\n */\n await cloudWatchEventClient.send(\n new PutTargetsCommand({\n Rule: eventRuleName,\n Targets: [\n {\n Arn: invokedFunctionArn,\n Id: eventTargetId,\n Input: JSON.stringify({\n datetime: datetime,\n tenant: tenant,\n locale: locale,\n invocationType: InvocationTypes.SCHEDULED,\n futureDatetime: futureDatetime\n } as HandlerArgs)\n }\n ]\n })\n );\n}\n\nexport const shouldScheduleTask = (\n nextTaskDatetime: string,\n currentTaskDatetime: string | null\n): boolean => {\n return !currentTaskDatetime || nextTaskDatetime < currentTaskDatetime;\n};\n\ninterface RestoreDateTimeParams\n extends Pick<Configuration, \"storageOperations\">,\n Pick<HandlerArgs, \"tenant\" | \"locale\"> {\n task: ApwScheduleAction;\n}\n\nexport const restoreDateTime = async ({\n locale,\n tenant,\n task: currentTask,\n storageOperations\n}: RestoreDateTimeParams): Promise<void> => {\n log(`Mark task \"${currentTask.id}\" as undone by restoring original \"datetime\".`);\n const item = await storageOperations.get({\n where: {\n tenant,\n locale,\n id: currentTask.id\n }\n });\n if (item) {\n const newDateTime = moveDateTimeToCurrentCentury(item.data.datetime);\n await storageOperations.update({\n item: {\n ...item,\n data: { ...item.data, datetime: newDateTime }\n },\n input: { ...item.data, datetime: newDateTime }\n });\n }\n};\n\ninterface ExecuteTaskParams\n extends Pick<ClientContext, \"handlerClient\">,\n Pick<Configuration, \"storageOperations\"> {\n args: HandlerArgs;\n lambdaName: string;\n}\n\nexport const executeTask = async ({\n args,\n lambdaName,\n handlerClient,\n storageOperations\n}: ExecuteTaskParams): Promise<void> => {\n log(`Executing task at: `, new Date().toISOString());\n\n if (typeof handlerClient.invoke === \"function\") {\n await handlerClient.invoke({\n name: lambdaName,\n payload: {\n futureDatetime: args.futureDatetime,\n datetime: args.datetime,\n tenant: args.tenant,\n locale: args.locale\n },\n await: false\n });\n }\n\n /**\n * Delete current schedule Task. So that, we can schedule a new one later.\n */\n try {\n await storageOperations.deleteCurrentTask({\n tenant: args.tenant,\n locale: args.locale\n });\n } catch (e) {\n console.error(e);\n }\n};\n"],"mappings":";;;;;;;;;;AAAA;AAEA;AAKA;AASA,MAAMA,GAAG,GAAGC,OAAO,CAACD,GAAG;AAOvB;AACA;AACA;AACA;AACA;AACO,eAAeE,uBAAuB,CAAC;EAC1CC,qBAAqB;EACrBC,kBAAkB;EAClBC,QAAQ;EACRC,cAAc;EACdC,MAAM;EACNC;AAC2B,CAAC,EAAE;EAC9B,MAAM;IAAEC,aAAa;IAAEC;EAAc,CAAC,GAAG,MAAM,IAAAC,qBAAc,GAAE;EAC/D;AACJ;AACA;EACI,MAAMC,oBAAoB,GAAG,IAAIC,4CAAoB,CAAC;IAClDC,IAAI,EAAEJ,aAAa;IACnBK,GAAG,EAAE,CAACN,aAAa;EACvB,CAAC,CAAC;EACF,MAAMO,qBAAqB,GAAG,MAAMb,qBAAqB,CAACc,IAAI,CAACL,oBAAoB,CAAC;EACpF;AACJ;AACA;EACI,IACI,OAAOI,qBAAqB,CAACE,gBAAgB,KAAK,QAAQ,IAC1DF,qBAAqB,CAACE,gBAAgB,KAAK,CAAC,EAC9C;IACEjB,OAAO,CAACkB,IAAI,CAAC,iCAAiC,CAAC;IAC/ClB,OAAO,CAACkB,IAAI,CAACH,qBAAqB,CAACI,aAAa,CAAC;EACrD;EACA;AACJ;AACA;EACI,MAAMC,iBAAiB,GAAG,IAAIC,yCAAiB,CAAC;IAC5CC,IAAI,EAAEb;EACV,CAAC,CAAC;EACF,MAAMP,qBAAqB,CAACc,IAAI,CAACI,iBAAiB,CAAC;;EAEnD;AACJ;AACA;AACA;AACA;EACI,MAAMG,cAAc,GAAG,IAAAC,+BAAwB,EAACpB,QAAQ,CAAC;EAEzD,MAAMqB,UAAU,GAAG;IACfH,IAAI,EAAEb,aAAa;IACnBiB,kBAAkB,EAAG,QAAOH,cAAe,GAAE;IAC7CI,KAAK,EAAE,SAAS;IAChBC,WAAW,EAAG;EAClB,CAAC;EAED,MAAM1B,qBAAqB,CAACc,IAAI,CAAC,IAAIa,sCAAc,CAACJ,UAAU,CAAC,CAAC;EAChE;AACJ;AACA;EACI,MAAMvB,qBAAqB,CAACc,IAAI,CAC5B,IAAIc,yCAAiB,CAAC;IAClBjB,IAAI,EAAEJ,aAAa;IACnBsB,OAAO,EAAE,CACL;MACIC,GAAG,EAAE7B,kBAAkB;MACvB8B,EAAE,EAAEzB,aAAa;MACjB0B,KAAK,EAAEC,IAAI,CAACC,SAAS,CAAC;QAClBhC,QAAQ,EAAEA,QAAQ;QAClBE,MAAM,EAAEA,MAAM;QACdC,MAAM,EAAEA,MAAM;QACd8B,cAAc,EAAEC,sBAAe,CAACC,SAAS;QACzClC,cAAc,EAAEA;MACpB,CAAC;IACL,CAAC;EAET,CAAC,CAAC,CACL;AACL;AAEO,MAAMmC,kBAAkB,GAAG,CAC9BC,gBAAwB,EACxBC,mBAAkC,KACxB;EACV,OAAO,CAACA,mBAAmB,IAAID,gBAAgB,GAAGC,mBAAmB;AACzE,CAAC;AAAC;AAQK,MAAMC,eAAe,GAAG,OAAO;EAClCpC,MAAM;EACND,MAAM;EACNsC,IAAI,EAAEC,WAAW;EACjBC;AACmB,CAAC,KAAoB;EACxC/C,GAAG,CAAE,cAAa8C,WAAW,CAACE,EAAG,+CAA8C,CAAC;EAChF,MAAMC,IAAI,GAAG,MAAMF,iBAAiB,CAACG,GAAG,CAAC;IACrCC,KAAK,EAAE;MACH5C,MAAM;MACNC,MAAM;MACNwC,EAAE,EAAEF,WAAW,CAACE;IACpB;EACJ,CAAC,CAAC;EACF,IAAIC,IAAI,EAAE;IACN,MAAMG,WAAW,GAAG,IAAAC,mCAA4B,EAACJ,IAAI,CAACK,IAAI,CAACjD,QAAQ,CAAC;IACpE,MAAM0C,iBAAiB,CAACQ,MAAM,CAAC;MAC3BN,IAAI,8DACGA,IAAI;QACPK,IAAI,8DAAOL,IAAI,CAACK,IAAI;UAAEjD,QAAQ,EAAE+C;QAAW;MAAE,EAChD;MACDI,KAAK,8DAAOP,IAAI,CAACK,IAAI;QAAEjD,QAAQ,EAAE+C;MAAW;IAChD,CAAC,CAAC;EACN;AACJ,CAAC;AAAC;AASK,MAAMK,WAAW,GAAG,OAAO;EAC9BC,IAAI;EACJC,UAAU;EACVC,aAAa;EACbb;AACe,CAAC,KAAoB;EACpC/C,GAAG,CAAE,qBAAoB,EAAE,IAAI6D,IAAI,EAAE,CAACC,WAAW,EAAE,CAAC;EAEpD,IAAI,OAAOF,aAAa,CAACG,MAAM,KAAK,UAAU,EAAE;IAC5C,MAAMH,aAAa,CAACG,MAAM,CAAC;MACvBC,IAAI,EAAEL,UAAU;MAChBM,OAAO,EAAE;QACL3D,cAAc,EAAEoD,IAAI,CAACpD,cAAc;QACnCD,QAAQ,EAAEqD,IAAI,CAACrD,QAAQ;QACvBE,MAAM,EAAEmD,IAAI,CAACnD,MAAM;QACnBC,MAAM,EAAEkD,IAAI,CAAClD;MACjB,CAAC;MACD0D,KAAK,EAAE;IACX,CAAC,CAAC;EACN;;EAEA;AACJ;AACA;EACI,IAAI;IACA,MAAMnB,iBAAiB,CAACoB,iBAAiB,CAAC;MACtC5D,MAAM,EAAEmD,IAAI,CAACnD,MAAM;MACnBC,MAAM,EAAEkD,IAAI,CAAClD;IACjB,CAAC,CAAC;EACN,CAAC,CAAC,OAAO4D,CAAC,EAAE;IACRnE,OAAO,CAACoE,KAAK,CAACD,CAAC,CAAC;EACpB;AACJ,CAAC;AAAC"}
1
+ {"version":3,"names":["log","console","scheduleLambdaExecution","cloudWatchEventClient","invokedFunctionArn","datetime","futureDatetime","tenant","locale","eventTargetId","eventRuleName","getApwSettings","removeTargetsCommand","RemoveTargetsCommand","Rule","Ids","removeTargetsResponse","send","FailedEntryCount","info","FailedEntries","deleteRuleCommand","DeleteRuleCommand","Name","cronExpression","dateTimeToCronExpression","ruleParams","ScheduleExpression","State","Description","PutRuleCommand","PutTargetsCommand","Targets","Arn","Id","Input","JSON","stringify","invocationType","InvocationTypes","SCHEDULED","shouldScheduleTask","nextTaskDatetime","currentTaskDatetime","restoreDateTime","task","currentTask","storageOperations","id","item","get","where","newDateTime","moveDateTimeToCurrentCentury","data","update","input","executeTask","args","lambdaName","handlerClient","Date","toISOString","invoke","name","payload","await","deleteCurrentTask","e","error"],"sources":["scheduleAction.utils.ts"],"sourcesContent":["import { dateTimeToCronExpression, moveDateTimeToCurrentCentury } from \"~/scheduler/handlers/utils\";\nimport { ApwScheduleAction } from \"~/scheduler/types\";\nimport {\n HandlerArgs,\n InvocationTypes,\n Configuration\n} from \"~/scheduler/handlers/scheduleAction/index\";\nimport {\n DeleteRuleCommand,\n RemoveTargetsCommand,\n PutTargetsCommand,\n PutRuleCommand\n} from \"@aws-sdk/client-cloudwatch-events\";\nimport { ClientContext } from \"@webiny/handler-client/types\";\nimport { getApwSettings } from \"~/scheduler/handlers/utils\";\n\nconst log = console.log;\n\ninterface ScheduleLambdaExecutionParams extends Omit<HandlerArgs, \"invocationType\"> {\n cloudWatchEventClient: any;\n invokedFunctionArn: string;\n}\n\n/**\n * Current API limit/quota for Cloudwatch events is sufficient for now. But, we should watch for it;\n * in case of scheduling becoming the most frequently used feature.\n * https://aws.amazon.com/about-aws/whats-new/2017/07/cloudwatch-events-increases-rules-and-api-requests-limits/\n */\nexport async function scheduleLambdaExecution({\n cloudWatchEventClient,\n invokedFunctionArn,\n datetime,\n futureDatetime,\n tenant,\n locale\n}: ScheduleLambdaExecutionParams) {\n const { eventTargetId, eventRuleName } = await getApwSettings();\n /**\n * Remove the target\n */\n const removeTargetsCommand = new RemoveTargetsCommand({\n Rule: eventRuleName,\n Ids: [eventTargetId]\n });\n const removeTargetsResponse = await cloudWatchEventClient.send(removeTargetsCommand);\n /**\n * Log error.\n */\n if (\n typeof removeTargetsResponse.FailedEntryCount === \"number\" &&\n removeTargetsResponse.FailedEntryCount !== 0\n ) {\n console.info(\"Failed in removing the targets!\");\n console.info(removeTargetsResponse.FailedEntries);\n }\n /**\n * Delete the Rule\n */\n const deleteRuleCommand = new DeleteRuleCommand({\n Name: eventRuleName\n });\n await cloudWatchEventClient.send(deleteRuleCommand);\n\n /**\n * Create a new one.\n * Min H D M DW Y\n * 20 10 10 03 * 2022\n */\n const cronExpression = dateTimeToCronExpression(datetime);\n\n const ruleParams = {\n Name: eventRuleName,\n ScheduleExpression: `cron(${cronExpression})`,\n State: \"ENABLED\",\n Description: `Enable us to schedule an action in publishing workflow at a particular datetime`\n };\n\n await cloudWatchEventClient.send(new PutRuleCommand(ruleParams));\n /**\n * Add lambda as target for the rule.\n */\n await cloudWatchEventClient.send(\n new PutTargetsCommand({\n Rule: eventRuleName,\n Targets: [\n {\n Arn: invokedFunctionArn,\n Id: eventTargetId,\n Input: JSON.stringify({\n datetime: datetime,\n tenant: tenant,\n locale: locale,\n invocationType: InvocationTypes.SCHEDULED,\n futureDatetime: futureDatetime\n } as HandlerArgs)\n }\n ]\n })\n );\n}\n\nexport const shouldScheduleTask = (\n nextTaskDatetime: string,\n currentTaskDatetime: string | null\n): boolean => {\n return !currentTaskDatetime || nextTaskDatetime < currentTaskDatetime;\n};\n\ninterface RestoreDateTimeParams\n extends Pick<Configuration, \"storageOperations\">,\n Pick<HandlerArgs, \"tenant\" | \"locale\"> {\n task: ApwScheduleAction;\n}\n\nexport const restoreDateTime = async ({\n locale,\n tenant,\n task: currentTask,\n storageOperations\n}: RestoreDateTimeParams): Promise<void> => {\n log(`Mark task \"${currentTask.id}\" as undone by restoring original \"datetime\".`);\n const item = await storageOperations.get({\n where: {\n tenant,\n locale,\n id: currentTask.id\n }\n });\n if (item) {\n const newDateTime = moveDateTimeToCurrentCentury(item.data.datetime);\n await storageOperations.update({\n item: {\n ...item,\n data: { ...item.data, datetime: newDateTime }\n },\n input: { ...item.data, datetime: newDateTime }\n });\n }\n};\n\ninterface ExecuteTaskParams\n extends Pick<ClientContext, \"handlerClient\">,\n Pick<Configuration, \"storageOperations\"> {\n args: HandlerArgs;\n lambdaName: string;\n}\n\nexport const executeTask = async ({\n args,\n lambdaName,\n handlerClient,\n storageOperations\n}: ExecuteTaskParams): Promise<void> => {\n log(`Executing task at: `, new Date().toISOString());\n\n if (typeof handlerClient.invoke === \"function\") {\n await handlerClient.invoke({\n name: lambdaName,\n payload: {\n futureDatetime: args.futureDatetime,\n datetime: args.datetime,\n tenant: args.tenant,\n locale: args.locale\n },\n await: false\n });\n }\n\n /**\n * Delete current schedule Task. So that, we can schedule a new one later.\n */\n try {\n await storageOperations.deleteCurrentTask({\n tenant: args.tenant,\n locale: args.locale\n });\n } catch (e) {\n console.error(e);\n }\n};\n"],"mappings":"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"}