@webiny/api-headless-cms-scheduler 0.0.0-unstable.0156a4c312

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 (54) hide show
  1. package/CmsSchedulerFeature.d.ts +4 -0
  2. package/CmsSchedulerFeature.js +23 -0
  3. package/CmsSchedulerFeature.js.map +1 -0
  4. package/LICENSE +21 -0
  5. package/README.md +11 -0
  6. package/exports/api/cms/scheduler.d.ts +2 -0
  7. package/exports/api/cms/scheduler.js +2 -0
  8. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.d.ts +22 -0
  9. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.js +49 -0
  10. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.js.map +1 -0
  11. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.d.ts +21 -0
  12. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js +41 -0
  13. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js.map +1 -0
  14. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.d.ts +21 -0
  15. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.js +40 -0
  16. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.js.map +1 -0
  17. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.d.ts +21 -0
  18. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js +41 -0
  19. package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js.map +1 -0
  20. package/features/CancelScheduledActionOnEntryChange/feature.d.ts +11 -0
  21. package/features/CancelScheduledActionOnEntryChange/feature.js +17 -0
  22. package/features/CancelScheduledActionOnEntryChange/feature.js.map +1 -0
  23. package/features/NamespaceHandler/NamespaceHandler.d.ts +15 -0
  24. package/features/NamespaceHandler/NamespaceHandler.js +44 -0
  25. package/features/NamespaceHandler/NamespaceHandler.js.map +1 -0
  26. package/features/PublishActionHandler/PublishEntryActionHandler.d.ts +35 -0
  27. package/features/PublishActionHandler/PublishEntryActionHandler.js +92 -0
  28. package/features/PublishActionHandler/PublishEntryActionHandler.js.map +1 -0
  29. package/features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.d.ts +15 -0
  30. package/features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.js +47 -0
  31. package/features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.js.map +1 -0
  32. package/features/SchedulePublishEntryUseCase/abstractions.d.ts +24 -0
  33. package/features/SchedulePublishEntryUseCase/abstractions.js +5 -0
  34. package/features/SchedulePublishEntryUseCase/abstractions.js.map +1 -0
  35. package/features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.d.ts +15 -0
  36. package/features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.js +47 -0
  37. package/features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.js.map +1 -0
  38. package/features/ScheduleUnpublishEntryUseCase/abstractions.d.ts +24 -0
  39. package/features/ScheduleUnpublishEntryUseCase/abstractions.js +5 -0
  40. package/features/ScheduleUnpublishEntryUseCase/abstractions.js.map +1 -0
  41. package/features/UnpublishActionHandler/UnpublishEntryActionHandler.d.ts +30 -0
  42. package/features/UnpublishActionHandler/UnpublishEntryActionHandler.js +69 -0
  43. package/features/UnpublishActionHandler/UnpublishEntryActionHandler.js.map +1 -0
  44. package/features/permissions/CmsSchedulerPermissions.d.ts +13 -0
  45. package/features/permissions/CmsSchedulerPermissions.js +31 -0
  46. package/features/permissions/CmsSchedulerPermissions.js.map +1 -0
  47. package/index.d.ts +1 -0
  48. package/index.js +1 -0
  49. package/package.json +40 -0
  50. package/types.d.ts +4 -0
  51. package/types.js +0 -0
  52. package/utils/namespace.d.ts +4 -0
  53. package/utils/namespace.js +9 -0
  54. package/utils/namespace.js.map +1 -0
@@ -0,0 +1,4 @@
1
+ export declare const CmsSchedulerFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,23 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { CancelScheduledActionOnEntryChangeFeature } from "./features/CancelScheduledActionOnEntryChange/feature.js";
3
+ import { CmsSchedulerPermissions } from "./features/permissions/CmsSchedulerPermissions.js";
4
+ import { NamespaceHandler } from "./features/NamespaceHandler/NamespaceHandler.js";
5
+ import { PublishEntryActionHandler } from "./features/PublishActionHandler/PublishEntryActionHandler.js";
6
+ import { UnpublishEntryActionHandler } from "./features/UnpublishActionHandler/UnpublishEntryActionHandler.js";
7
+ import { SchedulePublishEntryUseCase } from "./features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.js";
8
+ import { ScheduleUnpublishEntryUseCase } from "./features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.js";
9
+ const CmsSchedulerFeature = createFeature({
10
+ name: "CmsScheduler",
11
+ register (container) {
12
+ container.register(NamespaceHandler);
13
+ container.register(PublishEntryActionHandler);
14
+ container.register(UnpublishEntryActionHandler);
15
+ container.register(SchedulePublishEntryUseCase);
16
+ container.register(ScheduleUnpublishEntryUseCase);
17
+ CancelScheduledActionOnEntryChangeFeature.register(container);
18
+ container.register(CmsSchedulerPermissions);
19
+ }
20
+ });
21
+ export { CmsSchedulerFeature };
22
+
23
+ //# sourceMappingURL=CmsSchedulerFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CmsSchedulerFeature.js","sources":["../src/CmsSchedulerFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CancelScheduledActionOnEntryChangeFeature } from \"~/features/CancelScheduledActionOnEntryChange/feature.js\";\nimport { CmsSchedulerPermissions } from \"~/features/permissions/CmsSchedulerPermissions.js\";\nimport { NamespaceHandler } from \"~/features/NamespaceHandler/NamespaceHandler.js\";\nimport { PublishEntryActionHandler } from \"~/features/PublishActionHandler/PublishEntryActionHandler.js\";\nimport { UnpublishEntryActionHandler } from \"~/features/UnpublishActionHandler/UnpublishEntryActionHandler.js\";\nimport { SchedulePublishEntryUseCase } from \"~/features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.js\";\nimport { ScheduleUnpublishEntryUseCase } from \"~/features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.js\";\n\nexport const CmsSchedulerFeature = createFeature({\n name: \"CmsScheduler\",\n register(container) {\n // Pure DI registration (was a request-time ContextPlugin — none of it needs ctx/post-auth).\n container.register(NamespaceHandler);\n container.register(PublishEntryActionHandler);\n container.register(UnpublishEntryActionHandler);\n container.register(SchedulePublishEntryUseCase);\n container.register(ScheduleUnpublishEntryUseCase);\n\n CancelScheduledActionOnEntryChangeFeature.register(container);\n container.register(CmsSchedulerPermissions);\n }\n});\n"],"names":["CmsSchedulerFeature","createFeature","container","NamespaceHandler","PublishEntryActionHandler","UnpublishEntryActionHandler","SchedulePublishEntryUseCase","ScheduleUnpublishEntryUseCase","CancelScheduledActionOnEntryChangeFeature","CmsSchedulerPermissions"],"mappings":";;;;;;;;AASO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QAEnBC,0CAA0C,QAAQ,CAACN;QACnDA,UAAU,QAAQ,CAACO;IACvB;AACJ"}
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) Webiny
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,11 @@
1
+ # @webiny/api-headless-cms-scheduler
2
+
3
+ > [!NOTE]
4
+ > This package is part of the [Webiny](https://www.webiny.com) monorepo.
5
+ > It’s **included in every Webiny project by default** and is not meant to be used as a standalone package.
6
+
7
+ 📘 **Documentation:** [https://www.webiny.com/docs](https://www.webiny.com/docs)
8
+
9
+ ---
10
+
11
+ _This README file is automatically generated during the publish process._
@@ -0,0 +1,2 @@
1
+ export { SchedulePublishEntryUseCase } from "../../../features/SchedulePublishEntryUseCase/abstractions.js";
2
+ export { ScheduleUnpublishEntryUseCase } from "../../../features/ScheduleUnpublishEntryUseCase/abstractions.js";
@@ -0,0 +1,2 @@
1
+ export { SchedulePublishEntryUseCase } from "../../../features/SchedulePublishEntryUseCase/abstractions.js";
2
+ export { ScheduleUnpublishEntryUseCase } from "../../../features/ScheduleUnpublishEntryUseCase/abstractions.js";
@@ -0,0 +1,22 @@
1
+ import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ /**
5
+ * Cancels scheduled actions when an entry is deleted
6
+ *
7
+ * When a user deletes an entry, any scheduled publish/unpublish
8
+ * actions for all of its revisions should be canceled since the entry
9
+ * no longer exists.
10
+ */
11
+ declare class CancelScheduledActionOnEntryDeleteHandlerImpl implements EntryAfterDeleteEventHandler.Interface {
12
+ private listScheduledActions;
13
+ private cancelScheduledAction;
14
+ private logger;
15
+ constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledAction: CancelScheduledActionUseCase.Interface, logger: Logger.Interface);
16
+ handle(event: EntryAfterDeleteEventHandler.Event): Promise<void>;
17
+ private listSchedules;
18
+ }
19
+ export declare const CancelScheduledActionOnEntryDeleteEventHandler: typeof CancelScheduledActionOnEntryDeleteHandlerImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events").EntryAfterDeleteEvent>>;
21
+ };
22
+ export {};
@@ -0,0 +1,49 @@
1
+ import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ import { createNamespace } from "../../utils/namespace.js";
5
+ class CancelScheduledActionOnEntryDeleteHandlerImpl {
6
+ constructor(listScheduledActions, cancelScheduledAction, logger){
7
+ this.listScheduledActions = listScheduledActions;
8
+ this.cancelScheduledAction = cancelScheduledAction;
9
+ this.logger = logger;
10
+ }
11
+ async handle(event) {
12
+ const { entry, model } = event.payload;
13
+ if (model.isPrivate) return;
14
+ const schedules = await this.listSchedules(model.modelId, entry.entryId);
15
+ for (const action of schedules){
16
+ const cancelRes = await this.cancelScheduledAction.execute(action);
17
+ cancelRes.isFail();
18
+ }
19
+ }
20
+ async listSchedules(modelId, entryId) {
21
+ const actionsResult = await this.listScheduledActions.execute({
22
+ limit: 10000,
23
+ where: {
24
+ namespace: createNamespace({
25
+ modelId
26
+ }),
27
+ targetId_startsWith: `${entryId}#`
28
+ }
29
+ });
30
+ if (actionsResult.isFail()) {
31
+ this.logger.error({
32
+ error: actionsResult.error
33
+ }, "Could not list scheduled actions to cancel.");
34
+ return [];
35
+ }
36
+ return actionsResult.value.items;
37
+ }
38
+ }
39
+ const CancelScheduledActionOnEntryDeleteEventHandler = EntryAfterDeleteEventHandler.createImplementation({
40
+ implementation: CancelScheduledActionOnEntryDeleteHandlerImpl,
41
+ dependencies: [
42
+ ListScheduledActionsUseCase,
43
+ CancelScheduledActionUseCase,
44
+ Logger
45
+ ]
46
+ });
47
+ export { CancelScheduledActionOnEntryDeleteEventHandler };
48
+
49
+ //# sourceMappingURL=CancelScheduledActionOnEntryDeleteEventHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.js","sources":["../../../src/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.ts"],"sourcesContent":["import { EntryAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events\";\nimport {\n CancelScheduledActionUseCase,\n ListScheduledActionsUseCase\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\n\n/**\n * Cancels scheduled actions when an entry is deleted\n *\n * When a user deletes an entry, any scheduled publish/unpublish\n * actions for all of its revisions should be canceled since the entry\n * no longer exists.\n */\nclass CancelScheduledActionOnEntryDeleteHandlerImpl\n implements EntryAfterDeleteEventHandler.Interface\n{\n constructor(\n private listScheduledActions: ListScheduledActionsUseCase.Interface,\n private cancelScheduledAction: CancelScheduledActionUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n async handle(event: EntryAfterDeleteEventHandler.Event): Promise<void> {\n const { entry, model } = event.payload;\n\n // Skip private models\n if (model.isPrivate) {\n return;\n }\n\n const schedules = await this.listSchedules(model.modelId, entry.entryId);\n for (const action of schedules) {\n const cancelRes = await this.cancelScheduledAction.execute(action);\n if (cancelRes.isFail()) {\n // Silently ignore errors - this is non-critical cleanup.\n // The entry was deleted successfully, cancelling scheduled actions is best-effort.\n }\n }\n }\n\n private async listSchedules(modelId: string, entryId: string) {\n const actionsResult = await this.listScheduledActions.execute({\n limit: 10000,\n where: {\n namespace: createNamespace({ modelId }),\n targetId_startsWith: `${entryId}#`\n }\n });\n\n if (actionsResult.isFail()) {\n this.logger.error(\n { error: actionsResult.error },\n \"Could not list scheduled actions to cancel.\"\n );\n return [];\n }\n\n return actionsResult.value.items;\n }\n}\n\nexport const CancelScheduledActionOnEntryDeleteEventHandler =\n EntryAfterDeleteEventHandler.createImplementation({\n implementation: CancelScheduledActionOnEntryDeleteHandlerImpl,\n dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase, Logger]\n });\n"],"names":["CancelScheduledActionOnEntryDeleteHandlerImpl","listScheduledActions","cancelScheduledAction","logger","event","entry","model","schedules","action","cancelRes","modelId","entryId","actionsResult","createNamespace","CancelScheduledActionOnEntryDeleteEventHandler","EntryAfterDeleteEventHandler","ListScheduledActionsUseCase","CancelScheduledActionUseCase","Logger"],"mappings":";;;;AAeA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,qBAA6D,EAC7DC,MAAwB,CAClC;aAHUF,oBAAoB,GAApBA;aACAC,qBAAqB,GAArBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,OAAOC,KAAyC,EAAiB;QACnE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QAGtC,IAAIE,MAAM,SAAS,EACf;QAGJ,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAACD,MAAM,OAAO,EAAED,MAAM,OAAO;QACvE,KAAK,MAAMG,UAAUD,UAAW;YAC5B,MAAME,YAAY,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACD;YACvDC,UAAU,MAAM;QAIxB;IACJ;IAEA,MAAc,cAAcC,OAAe,EAAEC,OAAe,EAAE;QAC1D,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAC1D,OAAO;YACP,OAAO;gBACH,WAAWC,gBAAgB;oBAAEH;gBAAQ;gBACrC,qBAAqB,GAAGC,QAAQ,CAAC,CAAC;YACtC;QACJ;QAEA,IAAIC,cAAc,MAAM,IAAI;YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,OAAOA,cAAc,KAAK;YAAC,GAC7B;YAEJ,OAAO,EAAE;QACb;QAEA,OAAOA,cAAc,KAAK,CAAC,KAAK;IACpC;AACJ;AAEO,MAAME,iDACTC,6BAA6B,oBAAoB,CAAC;IAC9C,gBAAgBf;IAChB,cAAc;QAACgB;QAA6BC;QAA8BC;KAAO;AACrF"}
@@ -0,0 +1,21 @@
1
+ import { EntryAfterPublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ /**
5
+ * Cancels scheduled "publish" when an entry is manually published
6
+ *
7
+ * When a user manually publishes an entry, any scheduled publish
8
+ * action for that entry should be canceled since the manual action
9
+ * takes precedence.
10
+ */
11
+ declare class CancelScheduledActionOnPublishEventHandlerImpl implements EntryAfterPublishEventHandler.Interface {
12
+ private listScheduledActions;
13
+ private cancelScheduledAction;
14
+ private logger;
15
+ constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledAction: CancelScheduledActionUseCase.Interface, logger: Logger.Interface);
16
+ handle(event: EntryAfterPublishEventHandler.Event): Promise<void>;
17
+ }
18
+ export declare const CancelScheduledActionOnPublishEventHandler: typeof CancelScheduledActionOnPublishEventHandlerImpl & {
19
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/PublishEntry/events").EntryAfterPublishEvent>>;
20
+ };
21
+ export {};
@@ -0,0 +1,41 @@
1
+ import { EntryAfterPublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase, ScheduledActionTypePublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ import { createNamespace } from "../../utils/namespace.js";
5
+ class CancelScheduledActionOnPublishEventHandlerImpl {
6
+ constructor(listScheduledActions, cancelScheduledAction, logger){
7
+ this.listScheduledActions = listScheduledActions;
8
+ this.cancelScheduledAction = cancelScheduledAction;
9
+ this.logger = logger;
10
+ }
11
+ async handle(event) {
12
+ const { entry, model } = event.payload;
13
+ if (model.isPrivate) return;
14
+ const actionsResult = await this.listScheduledActions.execute({
15
+ where: {
16
+ namespace: createNamespace(model),
17
+ actionType: ScheduledActionTypePublish,
18
+ targetId: entry.id
19
+ }
20
+ });
21
+ if (actionsResult.isFail()) return void this.logger.error({
22
+ error: actionsResult.error
23
+ }, "Could not list scheduled actions to cancel.");
24
+ const actions = actionsResult.value.items;
25
+ for (const action of actions){
26
+ const cancelRes = await this.cancelScheduledAction.execute(action);
27
+ cancelRes.isFail();
28
+ }
29
+ }
30
+ }
31
+ const CancelScheduledActionOnPublishEventHandler = EntryAfterPublishEventHandler.createImplementation({
32
+ implementation: CancelScheduledActionOnPublishEventHandlerImpl,
33
+ dependencies: [
34
+ ListScheduledActionsUseCase,
35
+ CancelScheduledActionUseCase,
36
+ Logger
37
+ ]
38
+ });
39
+ export { CancelScheduledActionOnPublishEventHandler };
40
+
41
+ //# sourceMappingURL=CancelScheduledActionOnPublishEventHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js","sources":["../../../src/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.ts"],"sourcesContent":["import { EntryAfterPublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/events\";\nimport {\n CancelScheduledActionUseCase,\n ListScheduledActionsUseCase,\n ScheduledActionTypePublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\n\n/**\n * Cancels scheduled \"publish\" when an entry is manually published\n *\n * When a user manually publishes an entry, any scheduled publish\n * action for that entry should be canceled since the manual action\n * takes precedence.\n */\nclass CancelScheduledActionOnPublishEventHandlerImpl\n implements EntryAfterPublishEventHandler.Interface\n{\n constructor(\n private listScheduledActions: ListScheduledActionsUseCase.Interface,\n private cancelScheduledAction: CancelScheduledActionUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n async handle(event: EntryAfterPublishEventHandler.Event): Promise<void> {\n const { entry, model } = event.payload;\n\n // Skip private models\n if (model.isPrivate) {\n return;\n }\n\n const actionsResult = await this.listScheduledActions.execute({\n where: {\n namespace: createNamespace(model),\n actionType: ScheduledActionTypePublish,\n targetId: entry.id\n }\n });\n\n if (actionsResult.isFail()) {\n this.logger.error(\n { error: actionsResult.error },\n \"Could not list scheduled actions to cancel.\"\n );\n return;\n }\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledAction.execute(action);\n if (cancelRes.isFail()) {\n // Silently ignore errors - this is non-critical cleanup.\n // Even if a schedule runs on an already published action, nothing bad will happen.\n }\n }\n }\n}\n\nexport const CancelScheduledActionOnPublishEventHandler =\n EntryAfterPublishEventHandler.createImplementation({\n implementation: CancelScheduledActionOnPublishEventHandlerImpl,\n dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase, Logger]\n });\n"],"names":["CancelScheduledActionOnPublishEventHandlerImpl","listScheduledActions","cancelScheduledAction","logger","event","entry","model","actionsResult","createNamespace","ScheduledActionTypePublish","actions","action","cancelRes","CancelScheduledActionOnPublishEventHandler","EntryAfterPublishEventHandler","ListScheduledActionsUseCase","CancelScheduledActionUseCase","Logger"],"mappings":";;;;AAgBA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,qBAA6D,EAC7DC,MAAwB,CAClC;aAHUF,oBAAoB,GAApBA;aACAC,qBAAqB,GAArBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,OAAOC,KAA0C,EAAiB;QACpE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QAGtC,IAAIE,MAAM,SAAS,EACf;QAGJ,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAC1D,OAAO;gBACH,WAAWC,gBAAgBF;gBAC3B,YAAYG;gBACZ,UAAUJ,MAAM,EAAE;YACtB;QACJ;QAEA,IAAIE,cAAc,MAAM,IAAI,YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;YAAE,OAAOA,cAAc,KAAK;QAAC,GAC7B;QAKR,MAAMG,UAAUH,cAAc,KAAK,CAAC,KAAK;QAEzC,KAAK,MAAMI,UAAUD,QAAS;YAC1B,MAAME,YAAY,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACD;YACvDC,UAAU,MAAM;QAIxB;IACJ;AACJ;AAEO,MAAMC,6CACTC,8BAA8B,oBAAoB,CAAC;IAC/C,gBAAgBd;IAChB,cAAc;QAACe;QAA6BC;QAA8BC;KAAO;AACrF"}
@@ -0,0 +1,21 @@
1
+ import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ /**
5
+ * Cancels scheduled actions when an entry revision is deleted
6
+ *
7
+ * When a user deletes an entry revision, any scheduled publish/unpublish
8
+ * action for that revision should be canceled since the revision
9
+ * no longer exists.
10
+ */
11
+ declare class CancelScheduledActionOnDeleteHandlerImpl implements EntryAfterDeleteEventHandler.Interface {
12
+ private listScheduledActions;
13
+ private cancelScheduledAction;
14
+ private logger;
15
+ constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledAction: CancelScheduledActionUseCase.Interface, logger: Logger.Interface);
16
+ handle(event: EntryAfterDeleteEventHandler.Event): Promise<void>;
17
+ }
18
+ export declare const CancelScheduledActionOnRevisionDeleteEventHandler: typeof CancelScheduledActionOnDeleteHandlerImpl & {
19
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events").EntryAfterDeleteEvent>>;
20
+ };
21
+ export {};
@@ -0,0 +1,40 @@
1
+ import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ import { createNamespace } from "../../utils/namespace.js";
5
+ class CancelScheduledActionOnDeleteHandlerImpl {
6
+ constructor(listScheduledActions, cancelScheduledAction, logger){
7
+ this.listScheduledActions = listScheduledActions;
8
+ this.cancelScheduledAction = cancelScheduledAction;
9
+ this.logger = logger;
10
+ }
11
+ async handle(event) {
12
+ const { entry, model } = event.payload;
13
+ if (model.isPrivate) return;
14
+ const actionsResult = await this.listScheduledActions.execute({
15
+ where: {
16
+ namespace: createNamespace(model),
17
+ targetId: entry.id
18
+ }
19
+ });
20
+ if (actionsResult.isFail()) return void this.logger.error({
21
+ error: actionsResult.error
22
+ }, "Could not list scheduled actions to cancel.");
23
+ const actions = actionsResult.value.items;
24
+ for (const action of actions){
25
+ const cancelRes = await this.cancelScheduledAction.execute(action);
26
+ cancelRes.isFail();
27
+ }
28
+ }
29
+ }
30
+ const CancelScheduledActionOnRevisionDeleteEventHandler = EntryAfterDeleteEventHandler.createImplementation({
31
+ implementation: CancelScheduledActionOnDeleteHandlerImpl,
32
+ dependencies: [
33
+ ListScheduledActionsUseCase,
34
+ CancelScheduledActionUseCase,
35
+ Logger
36
+ ]
37
+ });
38
+ export { CancelScheduledActionOnRevisionDeleteEventHandler };
39
+
40
+ //# sourceMappingURL=CancelScheduledActionOnRevisionDeleteEventHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.js","sources":["../../../src/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.ts"],"sourcesContent":["import { EntryAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events\";\nimport {\n CancelScheduledActionUseCase,\n ListScheduledActionsUseCase\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\n\n/**\n * Cancels scheduled actions when an entry revision is deleted\n *\n * When a user deletes an entry revision, any scheduled publish/unpublish\n * action for that revision should be canceled since the revision\n * no longer exists.\n */\nclass CancelScheduledActionOnDeleteHandlerImpl implements EntryAfterDeleteEventHandler.Interface {\n constructor(\n private listScheduledActions: ListScheduledActionsUseCase.Interface,\n private cancelScheduledAction: CancelScheduledActionUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n async handle(event: EntryAfterDeleteEventHandler.Event): Promise<void> {\n const { entry, model } = event.payload;\n\n // Skip private models\n if (model.isPrivate) {\n return;\n }\n\n const actionsResult = await this.listScheduledActions.execute({\n where: {\n namespace: createNamespace(model),\n targetId: entry.id\n }\n });\n\n if (actionsResult.isFail()) {\n this.logger.error(\n { error: actionsResult.error },\n \"Could not list scheduled actions to cancel.\"\n );\n return;\n }\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledAction.execute(action);\n if (cancelRes.isFail()) {\n // Silently ignore errors - this is non-critical cleanup.\n // Entry was deleted successfully, cancelling scheduled actions is best-effort.\n }\n }\n }\n}\n\nexport const CancelScheduledActionOnRevisionDeleteEventHandler =\n EntryAfterDeleteEventHandler.createImplementation({\n implementation: CancelScheduledActionOnDeleteHandlerImpl,\n dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase, Logger]\n });\n"],"names":["CancelScheduledActionOnDeleteHandlerImpl","listScheduledActions","cancelScheduledAction","logger","event","entry","model","actionsResult","createNamespace","actions","action","cancelRes","CancelScheduledActionOnRevisionDeleteEventHandler","EntryAfterDeleteEventHandler","ListScheduledActionsUseCase","CancelScheduledActionUseCase","Logger"],"mappings":";;;;AAeA,MAAMA;IACF,YACYC,oBAA2D,EAC3DC,qBAA6D,EAC7DC,MAAwB,CAClC;aAHUF,oBAAoB,GAApBA;aACAC,qBAAqB,GAArBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,OAAOC,KAAyC,EAAiB;QACnE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QAGtC,IAAIE,MAAM,SAAS,EACf;QAGJ,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAC1D,OAAO;gBACH,WAAWC,gBAAgBF;gBAC3B,UAAUD,MAAM,EAAE;YACtB;QACJ;QAEA,IAAIE,cAAc,MAAM,IAAI,YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;YAAE,OAAOA,cAAc,KAAK;QAAC,GAC7B;QAKR,MAAME,UAAUF,cAAc,KAAK,CAAC,KAAK;QAEzC,KAAK,MAAMG,UAAUD,QAAS;YAC1B,MAAME,YAAY,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACD;YACvDC,UAAU,MAAM;QAIxB;IACJ;AACJ;AAEO,MAAMC,oDACTC,6BAA6B,oBAAoB,CAAC;IAC9C,gBAAgBb;IAChB,cAAc;QAACc;QAA6BC;QAA8BC;KAAO;AACrF"}
@@ -0,0 +1,21 @@
1
+ import { EntryAfterUnpublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ /**
5
+ * Cancels scheduled action when an entry is manually unpublished
6
+ *
7
+ * When a user manually unpublishes an entry revision, any scheduled unpublish
8
+ * action for that revision should be canceled since the manual action
9
+ * takes precedence.
10
+ */
11
+ declare class CancelScheduledActionOnUnpublishHandlerImpl implements EntryAfterUnpublishEventHandler.Interface {
12
+ private listScheduledActions;
13
+ private cancelScheduledAction;
14
+ private logger;
15
+ constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledAction: CancelScheduledActionUseCase.Interface, logger: Logger.Interface);
16
+ handle(event: EntryAfterUnpublishEventHandler.Event): Promise<void>;
17
+ }
18
+ export declare const CancelScheduledActionOnUnpublishEventHandler: typeof CancelScheduledActionOnUnpublishHandlerImpl & {
19
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events").EntryAfterUnpublishEvent>>;
20
+ };
21
+ export {};
@@ -0,0 +1,41 @@
1
+ import { EntryAfterUnpublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events";
2
+ import { CancelScheduledActionUseCase, ListScheduledActionsUseCase, ScheduledActionTypeUnpublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
+ import { createNamespace } from "../../utils/namespace.js";
5
+ class CancelScheduledActionOnUnpublishHandlerImpl {
6
+ constructor(listScheduledActions, cancelScheduledAction, logger){
7
+ this.listScheduledActions = listScheduledActions;
8
+ this.cancelScheduledAction = cancelScheduledAction;
9
+ this.logger = logger;
10
+ }
11
+ async handle(event) {
12
+ const { entry, model } = event.payload;
13
+ if (model.isPrivate) return;
14
+ const actionsResult = await this.listScheduledActions.execute({
15
+ where: {
16
+ namespace: createNamespace(model),
17
+ actionType: ScheduledActionTypeUnpublish,
18
+ targetId: entry.id
19
+ }
20
+ });
21
+ if (actionsResult.isFail()) return void this.logger.error({
22
+ error: actionsResult.error
23
+ }, "Could not list scheduled actions to cancel.");
24
+ const actions = actionsResult.value.items;
25
+ for (const action of actions){
26
+ const cancelRes = await this.cancelScheduledAction.execute(action);
27
+ cancelRes.isFail();
28
+ }
29
+ }
30
+ }
31
+ const CancelScheduledActionOnUnpublishEventHandler = EntryAfterUnpublishEventHandler.createImplementation({
32
+ implementation: CancelScheduledActionOnUnpublishHandlerImpl,
33
+ dependencies: [
34
+ ListScheduledActionsUseCase,
35
+ CancelScheduledActionUseCase,
36
+ Logger
37
+ ]
38
+ });
39
+ export { CancelScheduledActionOnUnpublishEventHandler };
40
+
41
+ //# sourceMappingURL=CancelScheduledActionOnUnpublishEventHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js","sources":["../../../src/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.ts"],"sourcesContent":["import { EntryAfterUnpublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events\";\nimport {\n CancelScheduledActionUseCase,\n ListScheduledActionsUseCase,\n ScheduledActionTypeUnpublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\n\n/**\n * Cancels scheduled action when an entry is manually unpublished\n *\n * When a user manually unpublishes an entry revision, any scheduled unpublish\n * action for that revision should be canceled since the manual action\n * takes precedence.\n */\nclass CancelScheduledActionOnUnpublishHandlerImpl\n implements EntryAfterUnpublishEventHandler.Interface\n{\n constructor(\n private listScheduledActions: ListScheduledActionsUseCase.Interface,\n private cancelScheduledAction: CancelScheduledActionUseCase.Interface,\n private logger: Logger.Interface\n ) {}\n\n async handle(event: EntryAfterUnpublishEventHandler.Event): Promise<void> {\n const { entry, model } = event.payload;\n\n // Skip private models\n if (model.isPrivate) {\n return;\n }\n\n const actionsResult = await this.listScheduledActions.execute({\n where: {\n namespace: createNamespace(model),\n actionType: ScheduledActionTypeUnpublish,\n targetId: entry.id\n }\n });\n\n if (actionsResult.isFail()) {\n this.logger.error(\n { error: actionsResult.error },\n \"Could not list scheduled actions to cancel.\"\n );\n return;\n }\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledAction.execute(action);\n if (cancelRes.isFail()) {\n // Silently ignore errors - this is non-critical cleanup.\n // Entry was unpublished successfully, cancelling scheduled actions is best-effort.\n }\n }\n }\n}\n\nexport const CancelScheduledActionOnUnpublishEventHandler =\n EntryAfterUnpublishEventHandler.createImplementation({\n implementation: CancelScheduledActionOnUnpublishHandlerImpl,\n dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase, Logger]\n });\n"],"names":["CancelScheduledActionOnUnpublishHandlerImpl","listScheduledActions","cancelScheduledAction","logger","event","entry","model","actionsResult","createNamespace","ScheduledActionTypeUnpublish","actions","action","cancelRes","CancelScheduledActionOnUnpublishEventHandler","EntryAfterUnpublishEventHandler","ListScheduledActionsUseCase","CancelScheduledActionUseCase","Logger"],"mappings":";;;;AAgBA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,qBAA6D,EAC7DC,MAAwB,CAClC;aAHUF,oBAAoB,GAApBA;aACAC,qBAAqB,GAArBA;aACAC,MAAM,GAANA;IACT;IAEH,MAAM,OAAOC,KAA4C,EAAiB;QACtE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGF,MAAM,OAAO;QAGtC,IAAIE,MAAM,SAAS,EACf;QAGJ,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YAC1D,OAAO;gBACH,WAAWC,gBAAgBF;gBAC3B,YAAYG;gBACZ,UAAUJ,MAAM,EAAE;YACtB;QACJ;QAEA,IAAIE,cAAc,MAAM,IAAI,YACxB,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;YAAE,OAAOA,cAAc,KAAK;QAAC,GAC7B;QAKR,MAAMG,UAAUH,cAAc,KAAK,CAAC,KAAK;QAEzC,KAAK,MAAMI,UAAUD,QAAS;YAC1B,MAAME,YAAY,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACD;YACvDC,UAAU,MAAM;QAIxB;IACJ;AACJ;AAEO,MAAMC,+CACTC,gCAAgC,oBAAoB,CAAC;IACjD,gBAAgBd;IAChB,cAAc;QAACe;QAA6BC;QAA8BC;KAAO;AACrF"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CancelScheduledActionOnEntryChange Feature
3
+ *
4
+ * Automatically cancels scheduled actions when entries are manually
5
+ * published, unpublished, or deleted. This ensures scheduled actions
6
+ * don't execute after a user has already performed the action manually.
7
+ */
8
+ export declare const CancelScheduledActionOnEntryChangeFeature: {
9
+ name: string;
10
+ register(container: import("@webiny/di").Container): void;
11
+ };
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { CancelScheduledActionOnPublishEventHandler } from "./CancelScheduledActionOnPublishEventHandler.js";
3
+ import { CancelScheduledActionOnUnpublishEventHandler } from "./CancelScheduledActionOnUnpublishEventHandler.js";
4
+ import { CancelScheduledActionOnEntryDeleteEventHandler } from "./CancelScheduledActionOnEntryDeleteEventHandler.js";
5
+ import { CancelScheduledActionOnRevisionDeleteEventHandler } from "./CancelScheduledActionOnRevisionDeleteEventHandler.js";
6
+ const CancelScheduledActionOnEntryChangeFeature = createFeature({
7
+ name: "CancelScheduledActionOnEntryChange",
8
+ register (container) {
9
+ container.register(CancelScheduledActionOnPublishEventHandler);
10
+ container.register(CancelScheduledActionOnUnpublishEventHandler);
11
+ container.register(CancelScheduledActionOnEntryDeleteEventHandler);
12
+ container.register(CancelScheduledActionOnRevisionDeleteEventHandler);
13
+ }
14
+ });
15
+ export { CancelScheduledActionOnEntryChangeFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/CancelScheduledActionOnEntryChange/feature.js","sources":["../../../src/features/CancelScheduledActionOnEntryChange/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CancelScheduledActionOnPublishEventHandler } from \"./CancelScheduledActionOnPublishEventHandler.js\";\nimport { CancelScheduledActionOnUnpublishEventHandler } from \"./CancelScheduledActionOnUnpublishEventHandler.js\";\nimport { CancelScheduledActionOnEntryDeleteEventHandler } from \"./CancelScheduledActionOnEntryDeleteEventHandler.js\";\nimport { CancelScheduledActionOnRevisionDeleteEventHandler } from \"./CancelScheduledActionOnRevisionDeleteEventHandler.js\";\n\n/**\n * CancelScheduledActionOnEntryChange Feature\n *\n * Automatically cancels scheduled actions when entries are manually\n * published, unpublished, or deleted. This ensures scheduled actions\n * don't execute after a user has already performed the action manually.\n */\nexport const CancelScheduledActionOnEntryChangeFeature = createFeature({\n name: \"CancelScheduledActionOnEntryChange\",\n register(container) {\n container.register(CancelScheduledActionOnPublishEventHandler);\n container.register(CancelScheduledActionOnUnpublishEventHandler);\n container.register(CancelScheduledActionOnEntryDeleteEventHandler);\n container.register(CancelScheduledActionOnRevisionDeleteEventHandler);\n }\n});\n"],"names":["CancelScheduledActionOnEntryChangeFeature","createFeature","container","CancelScheduledActionOnPublishEventHandler","CancelScheduledActionOnUnpublishEventHandler","CancelScheduledActionOnEntryDeleteEventHandler","CancelScheduledActionOnRevisionDeleteEventHandler"],"mappings":";;;;;AAaO,MAAMA,4CAA4CC,cAAc;IACnE,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;IACvB;AACJ"}
@@ -0,0 +1,15 @@
1
+ import { NamespaceHandler as NamespaceHandlerAbstraction } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
3
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js";
4
+ import type { GenericRecord } from "@webiny/api/types.js";
5
+ declare class NamespaceHandlerImpl implements NamespaceHandlerAbstraction.Interface<GenericRecord> {
6
+ private getModelUseCase;
7
+ private getEntryByIdUseCase;
8
+ constructor(getModelUseCase: GetModelUseCase.Interface, getEntryByIdUseCase: GetEntryByIdUseCase.Interface);
9
+ canHandle(namespace: string): boolean;
10
+ execute(params: NamespaceHandlerAbstraction.Params): NamespaceHandlerAbstraction.Response<GenericRecord>;
11
+ }
12
+ export declare const NamespaceHandler: typeof NamespaceHandlerImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-scheduler/features/NamespaceHandler/abstractions").INamespaceHandler<GenericRecord>>;
14
+ };
15
+ export {};
@@ -0,0 +1,44 @@
1
+ import { NamespaceHandler } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { extractModelIdFromNamespace } from "../../utils/namespace.js";
3
+ import { Result } from "@webiny/feature/exports/api.js";
4
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
5
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js";
6
+ class NamespaceHandlerImpl {
7
+ constructor(getModelUseCase, getEntryByIdUseCase){
8
+ this.getModelUseCase = getModelUseCase;
9
+ this.getEntryByIdUseCase = getEntryByIdUseCase;
10
+ }
11
+ canHandle(namespace) {
12
+ const modelId = extractModelIdFromNamespace(namespace);
13
+ return !!modelId;
14
+ }
15
+ async execute(params) {
16
+ const modelId = extractModelIdFromNamespace(params.namespace);
17
+ const modelResult = await this.getModelUseCase.execute(modelId);
18
+ if (modelResult.isFail()) return Result.fail(modelResult.error);
19
+ const model = modelResult.value;
20
+ const entryResult = await this.getEntryByIdUseCase.execute(model, params.targetId);
21
+ if (entryResult.isFail()) return Result.fail(entryResult.error);
22
+ const entry = entryResult.value;
23
+ const title = entry.values[model.titleFieldId] || "Unknown entry title";
24
+ return Result.ok({
25
+ namespace: params.namespace,
26
+ title,
27
+ modelId,
28
+ actionType: params.actionType,
29
+ targetId: params.targetId,
30
+ scheduleId: params.scheduleId,
31
+ immediately: params.immediately || false
32
+ });
33
+ }
34
+ }
35
+ const NamespaceHandler_NamespaceHandler = NamespaceHandler.createImplementation({
36
+ implementation: NamespaceHandlerImpl,
37
+ dependencies: [
38
+ GetModelUseCase,
39
+ GetEntryByIdUseCase
40
+ ]
41
+ });
42
+ export { NamespaceHandler_NamespaceHandler as NamespaceHandler };
43
+
44
+ //# sourceMappingURL=NamespaceHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/NamespaceHandler/NamespaceHandler.js","sources":["../../../src/features/NamespaceHandler/NamespaceHandler.ts"],"sourcesContent":["import { NamespaceHandler as NamespaceHandlerAbstraction } from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { extractModelIdFromNamespace } from \"~/utils/namespace.js\";\nimport { Result } from \"@webiny/feature/exports/api.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\nclass NamespaceHandlerImpl implements NamespaceHandlerAbstraction.Interface<GenericRecord> {\n public constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private getEntryByIdUseCase: GetEntryByIdUseCase.Interface\n ) {}\n\n public canHandle(namespace: string): boolean {\n const modelId = extractModelIdFromNamespace(namespace);\n\n return !!modelId;\n }\n\n public async execute(\n params: NamespaceHandlerAbstraction.Params\n ): NamespaceHandlerAbstraction.Response<GenericRecord> {\n /**\n * We know that modelId is ok because of the canHandle() method, which is always called before execute() and must return true for this handler to be executed.\n */\n const modelId = extractModelIdFromNamespace(params.namespace)!;\n // Fetch the target model\n const modelResult = await this.getModelUseCase.execute(modelId);\n if (modelResult.isFail()) {\n return Result.fail(modelResult.error as any);\n }\n\n const model = modelResult.value;\n\n // Fetch entry to get title\n const entryResult = await this.getEntryByIdUseCase.execute(model, params.targetId);\n if (entryResult.isFail()) {\n return Result.fail(entryResult.error as any);\n }\n\n const entry = entryResult.value;\n const title = entry.values[model.titleFieldId] || \"Unknown entry title\";\n\n return Result.ok({\n namespace: params.namespace,\n title,\n modelId,\n actionType: params.actionType,\n targetId: params.targetId,\n scheduleId: params.scheduleId,\n immediately: params.immediately || false\n });\n }\n}\n\nexport const NamespaceHandler = NamespaceHandlerAbstraction.createImplementation({\n implementation: NamespaceHandlerImpl,\n dependencies: [GetModelUseCase, GetEntryByIdUseCase]\n});\n"],"names":["NamespaceHandlerImpl","getModelUseCase","getEntryByIdUseCase","namespace","modelId","extractModelIdFromNamespace","params","modelResult","Result","model","entryResult","entry","title","NamespaceHandler","NamespaceHandlerAbstraction","GetModelUseCase","GetEntryByIdUseCase"],"mappings":";;;;;AAOA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,mBAAkD,CAC5D;aAFUD,eAAe,GAAfA;aACAC,mBAAmB,GAAnBA;IACT;IAEI,UAAUC,SAAiB,EAAW;QACzC,MAAMC,UAAUC,4BAA4BF;QAE5C,OAAO,CAAC,CAACC;IACb;IAEA,MAAa,QACTE,MAA0C,EACS;QAInD,MAAMF,UAAUC,4BAA4BC,OAAO,SAAS;QAE5D,MAAMC,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACH;QACvD,IAAIG,YAAY,MAAM,IAClB,OAAOC,OAAO,IAAI,CAACD,YAAY,KAAK;QAGxC,MAAME,QAAQF,YAAY,KAAK;QAG/B,MAAMG,cAAc,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAACD,OAAOH,OAAO,QAAQ;QACjF,IAAII,YAAY,MAAM,IAClB,OAAOF,OAAO,IAAI,CAACE,YAAY,KAAK;QAGxC,MAAMC,QAAQD,YAAY,KAAK;QAC/B,MAAME,QAAQD,MAAM,MAAM,CAACF,MAAM,YAAY,CAAC,IAAI;QAElD,OAAOD,OAAO,EAAE,CAAC;YACb,WAAWF,OAAO,SAAS;YAC3BM;YACAR;YACA,YAAYE,OAAO,UAAU;YAC7B,UAAUA,OAAO,QAAQ;YACzB,YAAYA,OAAO,UAAU;YAC7B,aAAaA,OAAO,WAAW,IAAI;QACvC;IACJ;AACJ;AAEO,MAAMO,oCAAmBC,iBAAAA,oBAAgD,CAAC;IAC7E,gBAAgBd;IAChB,cAAc;QAACe;QAAiBC;KAAoB;AACxD"}
@@ -0,0 +1,35 @@
1
+ import { ScheduledActionHandler, ScheduledActionType, type IScheduledAction } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
3
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
4
+ import { GetPublishedEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds";
5
+ import { PublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry";
6
+ import { UnpublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry";
7
+ import { RepublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/RepublishEntry";
8
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
9
+ import type { IScheduledActionPayload } from "../../types.js";
10
+ /**
11
+ * Handler for publishing CMS entries
12
+ *
13
+ * Handles the "Publish" action for CMS entries with namespace pattern: Cms/Entry/{modelId}
14
+ *
15
+ * Publishing logic:
16
+ * 1. If entry is not published -> publish it
17
+ * 2. If the same revision is already published -> republish it
18
+ * 3. If a different revision is published -> unpublish old, publish new
19
+ */
20
+ declare class PublishEntryActionHandlerImpl implements ScheduledActionHandler.Interface {
21
+ private getModelUseCase;
22
+ private getEntryByIdUseCase;
23
+ private getPublishedEntriesByIdsUseCase;
24
+ private publishEntryUseCase;
25
+ private unpublishEntryUseCase;
26
+ private republishEntryUseCase;
27
+ private identityContext;
28
+ constructor(getModelUseCase: GetModelUseCase.Interface, getEntryByIdUseCase: GetEntryByIdUseCase.Interface, getPublishedEntriesByIdsUseCase: GetPublishedEntriesByIdsUseCase.Interface, publishEntryUseCase: PublishEntryUseCase.Interface, unpublishEntryUseCase: UnpublishEntryUseCase.Interface, republishEntryUseCase: RepublishEntryUseCase.Interface, identityContext: IdentityContext.Interface);
29
+ canHandle(namespace: string, actionType: ScheduledActionType): boolean;
30
+ handle(action: IScheduledAction<IScheduledActionPayload>): Promise<void>;
31
+ }
32
+ export declare const PublishEntryActionHandler: typeof PublishEntryActionHandlerImpl & {
33
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-scheduler/shared/abstractions").IScheduledActionHandler>;
34
+ };
35
+ export {};
@@ -0,0 +1,92 @@
1
+ import { ScheduledActionHandler, ScheduledActionTypePublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
3
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
4
+ import { GetPublishedEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds";
5
+ import { PublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry";
6
+ import { UnpublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry";
7
+ import { RepublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/RepublishEntry";
8
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
9
+ import { extractModelIdFromNamespace } from "../../utils/namespace.js";
10
+ class PublishEntryActionHandlerImpl {
11
+ constructor(getModelUseCase, getEntryByIdUseCase, getPublishedEntriesByIdsUseCase, publishEntryUseCase, unpublishEntryUseCase, republishEntryUseCase, identityContext){
12
+ this.getModelUseCase = getModelUseCase;
13
+ this.getEntryByIdUseCase = getEntryByIdUseCase;
14
+ this.getPublishedEntriesByIdsUseCase = getPublishedEntriesByIdsUseCase;
15
+ this.publishEntryUseCase = publishEntryUseCase;
16
+ this.unpublishEntryUseCase = unpublishEntryUseCase;
17
+ this.republishEntryUseCase = republishEntryUseCase;
18
+ this.identityContext = identityContext;
19
+ }
20
+ canHandle(namespace, actionType) {
21
+ const modelId = extractModelIdFromNamespace(namespace);
22
+ if (!modelId) return false;
23
+ return actionType === ScheduledActionTypePublish;
24
+ }
25
+ async handle(action) {
26
+ const { payload } = action;
27
+ const modelId = payload.modelId;
28
+ const modelResult = await this.getModelUseCase.execute(modelId);
29
+ if (modelResult.isFail()) {
30
+ console.error(`Failed to get model "${modelId}" for scheduled publish action:`, modelResult.error, {
31
+ identity: this.identityContext.getIdentity()
32
+ });
33
+ throw new Error(`Model not found: ${modelId}`);
34
+ }
35
+ const model = modelResult.value;
36
+ const targetEntryResult = await this.getEntryByIdUseCase.execute(model, action.targetId);
37
+ if (targetEntryResult.isFail()) {
38
+ console.error(`Failed to get entry "${action.targetId}" for scheduled publish action:`, targetEntryResult.error);
39
+ throw new Error(`Entry not found: ${action.targetId}`);
40
+ }
41
+ const targetEntry = targetEntryResult.value;
42
+ const publishedEntriesResult = await this.getPublishedEntriesByIdsUseCase.execute(model, [
43
+ targetEntry.id
44
+ ]);
45
+ if (publishedEntriesResult.isFail()) {
46
+ console.error(`Failed to get published entries for "${targetEntry.id}":`, publishedEntriesResult.error);
47
+ throw new Error("Failed to check published entries");
48
+ }
49
+ const [publishedTargetEntry] = publishedEntriesResult.value;
50
+ if (!publishedTargetEntry) {
51
+ const publishResult = await this.publishEntryUseCase.execute(model, targetEntry.id);
52
+ if (publishResult.isFail()) {
53
+ console.error(`Failed to publish entry "${action.targetId}":`, publishResult.error);
54
+ throw new Error(`Failed to publish entry: ${action.targetId}`);
55
+ }
56
+ return;
57
+ }
58
+ if (publishedTargetEntry.id === targetEntry.id) {
59
+ const republishResult = await this.republishEntryUseCase.execute(model, targetEntry.id);
60
+ if (republishResult.isFail()) {
61
+ console.error(`Failed to republish entry "${action.targetId}":`, republishResult.error);
62
+ throw new Error(`Failed to republish entry: ${action.targetId}`);
63
+ }
64
+ return;
65
+ }
66
+ const unpublishResult = await this.unpublishEntryUseCase.execute(model, publishedTargetEntry.id);
67
+ if (unpublishResult.isFail()) {
68
+ console.error(`Failed to unpublish old revision "${publishedTargetEntry.id}":`, unpublishResult.error);
69
+ throw new Error(`Failed to unpublish old revision: ${publishedTargetEntry.id}`);
70
+ }
71
+ const publishResult = await this.publishEntryUseCase.execute(model, targetEntry.id);
72
+ if (publishResult.isFail()) {
73
+ console.error(`Failed to publish entry "${action.targetId}":`, publishResult.error);
74
+ throw new Error(`Failed to publish entry: ${action.targetId}`);
75
+ }
76
+ }
77
+ }
78
+ const PublishEntryActionHandler = ScheduledActionHandler.createImplementation({
79
+ implementation: PublishEntryActionHandlerImpl,
80
+ dependencies: [
81
+ GetModelUseCase,
82
+ GetEntryByIdUseCase,
83
+ GetPublishedEntriesByIdsUseCase,
84
+ PublishEntryUseCase,
85
+ UnpublishEntryUseCase,
86
+ RepublishEntryUseCase,
87
+ IdentityContext
88
+ ]
89
+ });
90
+ export { PublishEntryActionHandler };
91
+
92
+ //# sourceMappingURL=PublishEntryActionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/PublishActionHandler/PublishEntryActionHandler.js","sources":["../../../src/features/PublishActionHandler/PublishEntryActionHandler.ts"],"sourcesContent":["import {\n ScheduledActionHandler,\n ScheduledActionType,\n type IScheduledAction,\n ScheduledActionTypePublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { GetPublishedEntriesByIdsUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds\";\nimport { PublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry\";\nimport { RepublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/RepublishEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport type { IScheduledActionPayload } from \"~/types.js\";\nimport { extractModelIdFromNamespace } from \"~/utils/namespace.js\";\n\n/**\n * Handler for publishing CMS entries\n *\n * Handles the \"Publish\" action for CMS entries with namespace pattern: Cms/Entry/{modelId}\n *\n * Publishing logic:\n * 1. If entry is not published -> publish it\n * 2. If the same revision is already published -> republish it\n * 3. If a different revision is published -> unpublish old, publish new\n */\nclass PublishEntryActionHandlerImpl implements ScheduledActionHandler.Interface {\n constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private getEntryByIdUseCase: GetEntryByIdUseCase.Interface,\n private getPublishedEntriesByIdsUseCase: GetPublishedEntriesByIdsUseCase.Interface,\n private publishEntryUseCase: PublishEntryUseCase.Interface,\n private unpublishEntryUseCase: UnpublishEntryUseCase.Interface,\n private republishEntryUseCase: RepublishEntryUseCase.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n public canHandle(namespace: string, actionType: ScheduledActionType): boolean {\n const modelId = extractModelIdFromNamespace(namespace);\n if (!modelId) {\n return false;\n }\n return actionType === ScheduledActionTypePublish;\n }\n\n public async handle(action: IScheduledAction<IScheduledActionPayload>): Promise<void> {\n const { payload } = action;\n\n const modelId = payload.modelId;\n\n // Fetch the model\n const modelResult = await this.getModelUseCase.execute(modelId);\n if (modelResult.isFail()) {\n console.error(\n `Failed to get model \"${modelId}\" for scheduled publish action:`,\n modelResult.error,\n {\n identity: this.identityContext.getIdentity()\n }\n );\n throw new Error(`Model not found: ${modelId}`);\n }\n\n const model = modelResult.value;\n\n // Fetch the target entry\n const targetEntryResult = await this.getEntryByIdUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, action.targetId);\n if (targetEntryResult.isFail()) {\n console.error(\n `Failed to get entry \"${action.targetId}\" for scheduled publish action:`,\n targetEntryResult.error\n );\n throw new Error(`Entry not found: ${action.targetId}`);\n }\n\n const targetEntry = targetEntryResult.value;\n\n // Get published entries\n const publishedEntriesResult = await this.getPublishedEntriesByIdsUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, [targetEntry.id]);\n\n if (publishedEntriesResult.isFail()) {\n console.error(\n `Failed to get published entries for \"${targetEntry.id}\":`,\n publishedEntriesResult.error\n );\n throw new Error(`Failed to check published entries`);\n }\n\n const [publishedTargetEntry] = publishedEntriesResult.value;\n\n /**\n * Scenario 1: Entry has no published revision -> publish it\n */\n if (!publishedTargetEntry) {\n const publishResult = await this.publishEntryUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, targetEntry.id);\n if (publishResult.isFail()) {\n console.error(`Failed to publish entry \"${action.targetId}\":`, publishResult.error);\n throw new Error(`Failed to publish entry: ${action.targetId}`);\n }\n return;\n }\n\n /**\n * Scenario 2: Target entry is already published (same revision) -> republish it\n */\n if (publishedTargetEntry.id === targetEntry.id) {\n const republishResult = await this.republishEntryUseCase.execute(model, targetEntry.id);\n if (republishResult.isFail()) {\n console.error(\n `Failed to republish entry \"${action.targetId}\":`,\n republishResult.error\n );\n throw new Error(`Failed to republish entry: ${action.targetId}`);\n }\n return;\n }\n\n /**\n * Scenario 3: A different revision is published -> unpublish old, publish new\n */\n const unpublishResult = await this.unpublishEntryUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, publishedTargetEntry.id);\n if (unpublishResult.isFail()) {\n console.error(\n `Failed to unpublish old revision \"${publishedTargetEntry.id}\":`,\n unpublishResult.error\n );\n throw new Error(`Failed to unpublish old revision: ${publishedTargetEntry.id}`);\n }\n\n const publishResult = await this.publishEntryUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, targetEntry.id);\n if (publishResult.isFail()) {\n console.error(`Failed to publish entry \"${action.targetId}\":`, publishResult.error);\n throw new Error(`Failed to publish entry: ${action.targetId}`);\n }\n }\n}\n\nexport const PublishEntryActionHandler = ScheduledActionHandler.createImplementation({\n implementation: PublishEntryActionHandlerImpl,\n dependencies: [\n GetModelUseCase,\n GetEntryByIdUseCase,\n GetPublishedEntriesByIdsUseCase,\n PublishEntryUseCase,\n UnpublishEntryUseCase,\n RepublishEntryUseCase,\n IdentityContext\n ]\n});\n"],"names":["PublishEntryActionHandlerImpl","getModelUseCase","getEntryByIdUseCase","getPublishedEntriesByIdsUseCase","publishEntryUseCase","unpublishEntryUseCase","republishEntryUseCase","identityContext","namespace","actionType","modelId","extractModelIdFromNamespace","ScheduledActionTypePublish","action","payload","modelResult","console","Error","model","targetEntryResult","targetEntry","publishedEntriesResult","publishedTargetEntry","publishResult","republishResult","unpublishResult","PublishEntryActionHandler","ScheduledActionHandler","GetModelUseCase","GetEntryByIdUseCase","GetPublishedEntriesByIdsUseCase","PublishEntryUseCase","UnpublishEntryUseCase","RepublishEntryUseCase","IdentityContext"],"mappings":";;;;;;;;;AA0BA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,mBAAkD,EAClDC,+BAA0E,EAC1EC,mBAAkD,EAClDC,qBAAsD,EACtDC,qBAAsD,EACtDC,eAA0C,CACpD;aAPUN,eAAe,GAAfA;aACAC,mBAAmB,GAAnBA;aACAC,+BAA+B,GAA/BA;aACAC,mBAAmB,GAAnBA;aACAC,qBAAqB,GAArBA;aACAC,qBAAqB,GAArBA;aACAC,eAAe,GAAfA;IACT;IAEI,UAAUC,SAAiB,EAAEC,UAA+B,EAAW;QAC1E,MAAMC,UAAUC,4BAA4BH;QAC5C,IAAI,CAACE,SACD,OAAO;QAEX,OAAOD,eAAeG;IAC1B;IAEA,MAAa,OAAOC,MAAiD,EAAiB;QAClF,MAAM,EAAEC,OAAO,EAAE,GAAGD;QAEpB,MAAMH,UAAUI,QAAQ,OAAO;QAG/B,MAAMC,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACL;QACvD,IAAIK,YAAY,MAAM,IAAI;YACtBC,QAAQ,KAAK,CACT,CAAC,qBAAqB,EAAEN,QAAQ,+BAA+B,CAAC,EAChEK,YAAY,KAAK,EACjB;gBACI,UAAU,IAAI,CAAC,eAAe,CAAC,WAAW;YAC9C;YAEJ,MAAM,IAAIE,MAAM,CAAC,iBAAiB,EAAEP,SAAS;QACjD;QAEA,MAAMQ,QAAQH,YAAY,KAAK;QAG/B,MAAMI,oBAAoB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAE9DD,OAAOL,OAAO,QAAQ;QACxB,IAAIM,kBAAkB,MAAM,IAAI;YAC5BH,QAAQ,KAAK,CACT,CAAC,qBAAqB,EAAEH,OAAO,QAAQ,CAAC,+BAA+B,CAAC,EACxEM,kBAAkB,KAAK;YAE3B,MAAM,IAAIF,MAAM,CAAC,iBAAiB,EAAEJ,OAAO,QAAQ,EAAE;QACzD;QAEA,MAAMO,cAAcD,kBAAkB,KAAK;QAG3C,MAAME,yBAAyB,MAAM,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAE/EH,OAAO;YAACE,YAAY,EAAE;SAAC;QAEzB,IAAIC,uBAAuB,MAAM,IAAI;YACjCL,QAAQ,KAAK,CACT,CAAC,qCAAqC,EAAEI,YAAY,EAAE,CAAC,EAAE,CAAC,EAC1DC,uBAAuB,KAAK;YAEhC,MAAM,IAAIJ,MAAM;QACpB;QAEA,MAAM,CAACK,qBAAqB,GAAGD,uBAAuB,KAAK;QAK3D,IAAI,CAACC,sBAAsB;YACvB,MAAMC,gBAAgB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAE1DL,OAAOE,YAAY,EAAE;YACvB,IAAIG,cAAc,MAAM,IAAI;gBACxBP,QAAQ,KAAK,CAAC,CAAC,yBAAyB,EAAEH,OAAO,QAAQ,CAAC,EAAE,CAAC,EAAEU,cAAc,KAAK;gBAClF,MAAM,IAAIN,MAAM,CAAC,yBAAyB,EAAEJ,OAAO,QAAQ,EAAE;YACjE;YACA;QACJ;QAKA,IAAIS,qBAAqB,EAAE,KAAKF,YAAY,EAAE,EAAE;YAC5C,MAAMI,kBAAkB,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACN,OAAOE,YAAY,EAAE;YACtF,IAAII,gBAAgB,MAAM,IAAI;gBAC1BR,QAAQ,KAAK,CACT,CAAC,2BAA2B,EAAEH,OAAO,QAAQ,CAAC,EAAE,CAAC,EACjDW,gBAAgB,KAAK;gBAEzB,MAAM,IAAIP,MAAM,CAAC,2BAA2B,EAAEJ,OAAO,QAAQ,EAAE;YACnE;YACA;QACJ;QAKA,MAAMY,kBAAkB,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAE9DP,OAAOI,qBAAqB,EAAE;QAChC,IAAIG,gBAAgB,MAAM,IAAI;YAC1BT,QAAQ,KAAK,CACT,CAAC,kCAAkC,EAAEM,qBAAqB,EAAE,CAAC,EAAE,CAAC,EAChEG,gBAAgB,KAAK;YAEzB,MAAM,IAAIR,MAAM,CAAC,kCAAkC,EAAEK,qBAAqB,EAAE,EAAE;QAClF;QAEA,MAAMC,gBAAgB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAE1DL,OAAOE,YAAY,EAAE;QACvB,IAAIG,cAAc,MAAM,IAAI;YACxBP,QAAQ,KAAK,CAAC,CAAC,yBAAyB,EAAEH,OAAO,QAAQ,CAAC,EAAE,CAAC,EAAEU,cAAc,KAAK;YAClF,MAAM,IAAIN,MAAM,CAAC,yBAAyB,EAAEJ,OAAO,QAAQ,EAAE;QACjE;IACJ;AACJ;AAEO,MAAMa,4BAA4BC,uBAAuB,oBAAoB,CAAC;IACjF,gBAAgB3B;IAChB,cAAc;QACV4B;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,15 @@
1
+ import { SchedulePublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
2
+ import { ScheduleActionUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
4
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
5
+ declare class SchedulePublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private scheduleAction;
7
+ private accessControl;
8
+ private getModelUseCase;
9
+ constructor(scheduleAction: ScheduleActionUseCase.Interface, accessControl: AccessControl.Interface, getModelUseCase: GetModelUseCase.Interface);
10
+ execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Result;
11
+ }
12
+ export declare const SchedulePublishEntryUseCase: typeof SchedulePublishEntryUseCaseImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ISchedulePublishEntryUseCase>;
14
+ };
15
+ export {};
@@ -0,0 +1,47 @@
1
+ import { SchedulePublishEntryUseCase } from "./abstractions.js";
2
+ import { ScheduleActionUseCase, ScheduledActionTypePublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { createNamespace } from "../../utils/namespace.js";
4
+ import { Result } from "@webiny/feature/exports/api.js";
5
+ import { EntryNotAuthorizedError } from "@webiny/api-headless-cms/domain/contentEntry/errors.js";
6
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
7
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
8
+ class SchedulePublishEntryUseCaseImpl {
9
+ constructor(scheduleAction, accessControl, getModelUseCase){
10
+ this.scheduleAction = scheduleAction;
11
+ this.accessControl = accessControl;
12
+ this.getModelUseCase = getModelUseCase;
13
+ }
14
+ async execute(params) {
15
+ const { model: initialModel, tenant, scheduleFor, id } = params;
16
+ const modelResult = await this.getModelUseCase.execute(initialModel.modelId);
17
+ if (modelResult.isFail()) return Result.fail(modelResult.error);
18
+ const model = modelResult.value;
19
+ const canAccess = await this.accessControl.canAccessEntry({
20
+ model,
21
+ pw: "p"
22
+ });
23
+ if (!canAccess) return Result.fail(EntryNotAuthorizedError.fromModel(model));
24
+ const scheduleResult = await this.scheduleAction.execute({
25
+ namespace: createNamespace(model),
26
+ actionType: ScheduledActionTypePublish,
27
+ scheduleFor,
28
+ tenant,
29
+ targetId: id
30
+ });
31
+ if (scheduleResult.isFail()) return Result.fail(scheduleResult.error);
32
+ return Result.ok({
33
+ scheduledAction: scheduleResult.value
34
+ });
35
+ }
36
+ }
37
+ const SchedulePublishEntryUseCase_SchedulePublishEntryUseCase = SchedulePublishEntryUseCase.createImplementation({
38
+ implementation: SchedulePublishEntryUseCaseImpl,
39
+ dependencies: [
40
+ ScheduleActionUseCase,
41
+ AccessControl,
42
+ GetModelUseCase
43
+ ]
44
+ });
45
+ export { SchedulePublishEntryUseCase_SchedulePublishEntryUseCase as SchedulePublishEntryUseCase };
46
+
47
+ //# sourceMappingURL=SchedulePublishEntryUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.js","sources":["../../../src/features/SchedulePublishEntryUseCase/SchedulePublishEntryUseCase.ts"],"sourcesContent":["import { SchedulePublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport {\n ScheduleActionUseCase,\n ScheduledActionTypePublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\nimport { Result } from \"@webiny/feature/exports/api.js\";\nimport { EntryNotAuthorizedError } from \"@webiny/api-headless-cms/domain/contentEntry/errors.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\n\nclass SchedulePublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private scheduleAction: ScheduleActionUseCase.Interface,\n private accessControl: AccessControl.Interface,\n private getModelUseCase: GetModelUseCase.Interface\n ) {}\n\n public async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Result {\n const { model: initialModel, tenant, scheduleFor, id } = params;\n\n const modelResult = await this.getModelUseCase.execute(initialModel.modelId);\n if (modelResult.isFail()) {\n return Result.fail(modelResult.error as any);\n }\n const model = modelResult.value;\n\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model) as any);\n }\n\n const scheduleResult = await this.scheduleAction.execute({\n namespace: createNamespace(model),\n actionType: ScheduledActionTypePublish,\n scheduleFor,\n tenant,\n targetId: id\n });\n if (scheduleResult.isFail()) {\n return Result.fail(scheduleResult.error);\n }\n return Result.ok({\n scheduledAction: scheduleResult.value\n });\n }\n}\n\nexport const SchedulePublishEntryUseCase = UseCaseAbstraction.createImplementation({\n implementation: SchedulePublishEntryUseCaseImpl,\n dependencies: [ScheduleActionUseCase, AccessControl, GetModelUseCase]\n});\n"],"names":["SchedulePublishEntryUseCaseImpl","scheduleAction","accessControl","getModelUseCase","params","initialModel","tenant","scheduleFor","id","modelResult","Result","model","canAccess","EntryNotAuthorizedError","scheduleResult","createNamespace","ScheduledActionTypePublish","SchedulePublishEntryUseCase","UseCaseAbstraction","ScheduleActionUseCase","AccessControl","GetModelUseCase"],"mappings":";;;;;;;AAWA,MAAMA;IACF,YACYC,cAA+C,EAC/CC,aAAsC,EACtCC,eAA0C,CACpD;aAHUF,cAAc,GAAdA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAa,QAAQC,MAAiC,EAA6B;QAC/E,MAAM,EAAE,OAAOC,YAAY,EAAEC,MAAM,EAAEC,WAAW,EAAEC,EAAE,EAAE,GAAGJ;QAEzD,MAAMK,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACJ,aAAa,OAAO;QAC3E,IAAII,YAAY,MAAM,IAClB,OAAOC,OAAO,IAAI,CAACD,YAAY,KAAK;QAExC,MAAME,QAAQF,YAAY,KAAK;QAE/B,MAAMG,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAED;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACC,WACD,OAAOF,OAAO,IAAI,CAACG,wBAAwB,SAAS,CAACF;QAGzD,MAAMG,iBAAiB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACrD,WAAWC,gBAAgBJ;YAC3B,YAAYK;YACZT;YACAD;YACA,UAAUE;QACd;QACA,IAAIM,eAAe,MAAM,IACrB,OAAOJ,OAAO,IAAI,CAACI,eAAe,KAAK;QAE3C,OAAOJ,OAAO,EAAE,CAAC;YACb,iBAAiBI,eAAe,KAAK;QACzC;IACJ;AACJ;AAEO,MAAMG,0DAA8BC,4BAAAA,oBAAuC,CAAC;IAC/E,gBAAgBlB;IAChB,cAAc;QAACmB;QAAuBC;QAAeC;KAAgB;AACzE"}
@@ -0,0 +1,24 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import type { IScheduledAction, ScheduleActionError } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
4
+ export interface ISchedulePublishEntryUseCaseParams {
5
+ id: string;
6
+ model: Pick<CmsModel, "modelId">;
7
+ tenant: string;
8
+ scheduleFor: Date;
9
+ }
10
+ export interface ISchedulePublishEntryUseCaseResult {
11
+ scheduledAction: IScheduledAction;
12
+ }
13
+ export type ISchedulePublishEntryUseCaseResponse = Promise<Result<ISchedulePublishEntryUseCaseResult, ScheduleActionError>>;
14
+ export interface ISchedulePublishEntryUseCase {
15
+ execute(params: ISchedulePublishEntryUseCaseParams): ISchedulePublishEntryUseCaseResponse;
16
+ }
17
+ /** Schedule an entry for future publishing. */
18
+ export declare const SchedulePublishEntryUseCase: import("@webiny/di").Abstraction<ISchedulePublishEntryUseCase>;
19
+ export declare namespace SchedulePublishEntryUseCase {
20
+ type Interface = ISchedulePublishEntryUseCase;
21
+ type Error = ScheduleActionError;
22
+ type Params = ISchedulePublishEntryUseCaseParams;
23
+ type Result = ISchedulePublishEntryUseCaseResponse;
24
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const SchedulePublishEntryUseCase = createAbstraction("CmsScheduler/SchedulePublishEntryUseCase");
3
+ export { SchedulePublishEntryUseCase };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/SchedulePublishEntryUseCase/abstractions.js","sources":["../../../src/features/SchedulePublishEntryUseCase/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type {\n IScheduledAction,\n ScheduleActionError\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport interface ISchedulePublishEntryUseCaseParams {\n id: string;\n model: Pick<CmsModel, \"modelId\">;\n tenant: string;\n scheduleFor: Date;\n}\n\nexport interface ISchedulePublishEntryUseCaseResult {\n scheduledAction: IScheduledAction;\n}\n\nexport type ISchedulePublishEntryUseCaseResponse = Promise<\n Result<ISchedulePublishEntryUseCaseResult, ScheduleActionError>\n>;\n\nexport interface ISchedulePublishEntryUseCase {\n execute(params: ISchedulePublishEntryUseCaseParams): ISchedulePublishEntryUseCaseResponse;\n}\n\n/** Schedule an entry for future publishing. */\nexport const SchedulePublishEntryUseCase = createAbstraction<ISchedulePublishEntryUseCase>(\n \"CmsScheduler/SchedulePublishEntryUseCase\"\n);\n\nexport namespace SchedulePublishEntryUseCase {\n export type Interface = ISchedulePublishEntryUseCase;\n export type Error = ScheduleActionError;\n export type Params = ISchedulePublishEntryUseCaseParams;\n export type Result = ISchedulePublishEntryUseCaseResponse;\n}\n"],"names":["SchedulePublishEntryUseCase","createAbstraction"],"mappings":";AA2BO,MAAMA,8BAA8BC,kBACvC"}
@@ -0,0 +1,15 @@
1
+ import { ScheduleUnpublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
2
+ import { ScheduleActionUseCase } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
4
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
5
+ declare class ScheduleUnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private scheduleAction;
7
+ private accessControl;
8
+ private getModelUseCase;
9
+ constructor(scheduleAction: ScheduleActionUseCase.Interface, accessControl: AccessControl.Interface, getModelUseCase: GetModelUseCase.Interface);
10
+ execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Result;
11
+ }
12
+ export declare const ScheduleUnpublishEntryUseCase: typeof ScheduleUnpublishEntryUseCaseImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IScheduleUnpublishEntryUseCase>;
14
+ };
15
+ export {};
@@ -0,0 +1,47 @@
1
+ import { ScheduleUnpublishEntryUseCase } from "./abstractions.js";
2
+ import { ScheduleActionUseCase, ScheduledActionTypeUnpublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import { createNamespace } from "../../utils/namespace.js";
4
+ import { Result } from "@webiny/feature/exports/api.js";
5
+ import { AccessControl } from "@webiny/api-headless-cms/features/shared/abstractions.js";
6
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
7
+ import { EntryNotAuthorizedError } from "@webiny/api-headless-cms/domain/contentEntry/errors.js";
8
+ class ScheduleUnpublishEntryUseCaseImpl {
9
+ constructor(scheduleAction, accessControl, getModelUseCase){
10
+ this.scheduleAction = scheduleAction;
11
+ this.accessControl = accessControl;
12
+ this.getModelUseCase = getModelUseCase;
13
+ }
14
+ async execute(params) {
15
+ const { model: initialModel, scheduleFor, tenant, id } = params;
16
+ const modelResult = await this.getModelUseCase.execute(initialModel.modelId);
17
+ if (modelResult.isFail()) return Result.fail(modelResult.error);
18
+ const model = modelResult.value;
19
+ const canAccess = await this.accessControl.canAccessEntry({
20
+ model,
21
+ pw: "u"
22
+ });
23
+ if (!canAccess) return Result.fail(EntryNotAuthorizedError.fromModel(model));
24
+ const scheduleResult = await this.scheduleAction.execute({
25
+ namespace: createNamespace(model),
26
+ actionType: ScheduledActionTypeUnpublish,
27
+ scheduleFor,
28
+ tenant,
29
+ targetId: id
30
+ });
31
+ if (scheduleResult.isFail()) return Result.fail(scheduleResult.error);
32
+ return Result.ok({
33
+ scheduledAction: scheduleResult.value
34
+ });
35
+ }
36
+ }
37
+ const ScheduleUnpublishEntryUseCase_ScheduleUnpublishEntryUseCase = ScheduleUnpublishEntryUseCase.createImplementation({
38
+ implementation: ScheduleUnpublishEntryUseCaseImpl,
39
+ dependencies: [
40
+ ScheduleActionUseCase,
41
+ AccessControl,
42
+ GetModelUseCase
43
+ ]
44
+ });
45
+ export { ScheduleUnpublishEntryUseCase_ScheduleUnpublishEntryUseCase as ScheduleUnpublishEntryUseCase };
46
+
47
+ //# sourceMappingURL=ScheduleUnpublishEntryUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.js","sources":["../../../src/features/ScheduleUnpublishEntryUseCase/ScheduleUnpublishEntryUseCase.ts"],"sourcesContent":["import { ScheduleUnpublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport {\n ScheduleActionUseCase,\n ScheduledActionTypeUnpublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { createNamespace } from \"~/utils/namespace.js\";\nimport { Result } from \"@webiny/feature/exports/api.js\";\nimport { AccessControl } from \"@webiny/api-headless-cms/features/shared/abstractions.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { EntryNotAuthorizedError } from \"@webiny/api-headless-cms/domain/contentEntry/errors.js\";\n\nclass ScheduleUnpublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private scheduleAction: ScheduleActionUseCase.Interface,\n private accessControl: AccessControl.Interface,\n private getModelUseCase: GetModelUseCase.Interface\n ) {}\n\n public async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Result {\n const { model: initialModel, scheduleFor, tenant, id } = params;\n\n const modelResult = await this.getModelUseCase.execute(initialModel.modelId);\n if (modelResult.isFail()) {\n return Result.fail(modelResult.error as any);\n }\n const model = modelResult.value;\n\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"u\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model) as any);\n }\n\n const scheduleResult = await this.scheduleAction.execute({\n namespace: createNamespace(model),\n actionType: ScheduledActionTypeUnpublish,\n scheduleFor,\n tenant,\n targetId: id\n });\n if (scheduleResult.isFail()) {\n return Result.fail(scheduleResult.error);\n }\n return Result.ok({\n scheduledAction: scheduleResult.value\n });\n }\n}\n\nexport const ScheduleUnpublishEntryUseCase = UseCaseAbstraction.createImplementation({\n implementation: ScheduleUnpublishEntryUseCaseImpl,\n dependencies: [ScheduleActionUseCase, AccessControl, GetModelUseCase]\n});\n"],"names":["ScheduleUnpublishEntryUseCaseImpl","scheduleAction","accessControl","getModelUseCase","params","initialModel","scheduleFor","tenant","id","modelResult","Result","model","canAccess","EntryNotAuthorizedError","scheduleResult","createNamespace","ScheduledActionTypeUnpublish","ScheduleUnpublishEntryUseCase","UseCaseAbstraction","ScheduleActionUseCase","AccessControl","GetModelUseCase"],"mappings":";;;;;;;AAWA,MAAMA;IACF,YACYC,cAA+C,EAC/CC,aAAsC,EACtCC,eAA0C,CACpD;aAHUF,cAAc,GAAdA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAa,QAAQC,MAAiC,EAA6B;QAC/E,MAAM,EAAE,OAAOC,YAAY,EAAEC,WAAW,EAAEC,MAAM,EAAEC,EAAE,EAAE,GAAGJ;QAEzD,MAAMK,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACJ,aAAa,OAAO;QAC3E,IAAII,YAAY,MAAM,IAClB,OAAOC,OAAO,IAAI,CAACD,YAAY,KAAK;QAExC,MAAME,QAAQF,YAAY,KAAK;QAE/B,MAAMG,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAED;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACC,WACD,OAAOF,OAAO,IAAI,CAACG,wBAAwB,SAAS,CAACF;QAGzD,MAAMG,iBAAiB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YACrD,WAAWC,gBAAgBJ;YAC3B,YAAYK;YACZV;YACAC;YACA,UAAUC;QACd;QACA,IAAIM,eAAe,MAAM,IACrB,OAAOJ,OAAO,IAAI,CAACI,eAAe,KAAK;QAE3C,OAAOJ,OAAO,EAAE,CAAC;YACb,iBAAiBI,eAAe,KAAK;QACzC;IACJ;AACJ;AAEO,MAAMG,8DAAgCC,8BAAAA,oBAAuC,CAAC;IACjF,gBAAgBlB;IAChB,cAAc;QAACmB;QAAuBC;QAAeC;KAAgB;AACzE"}
@@ -0,0 +1,24 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import type { IScheduledAction, ScheduleActionError } from "@webiny/api-scheduler/exports/api/scheduler.js";
3
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
4
+ export interface IScheduleUnpublishEntryUseCaseParams {
5
+ id: string;
6
+ model: Pick<CmsModel, "modelId">;
7
+ tenant: string;
8
+ scheduleFor: Date;
9
+ }
10
+ export interface IScheduleUnpublishEntryUseCaseResult {
11
+ scheduledAction: IScheduledAction;
12
+ }
13
+ export type IScheduleUnpublishEntryUseCaseResponse = Promise<Result<IScheduleUnpublishEntryUseCaseResult, ScheduleActionError>>;
14
+ export interface IScheduleUnpublishEntryUseCase {
15
+ execute(params: IScheduleUnpublishEntryUseCaseParams): IScheduleUnpublishEntryUseCaseResponse;
16
+ }
17
+ /** Schedule an entry for future unpublishing. */
18
+ export declare const ScheduleUnpublishEntryUseCase: import("@webiny/di").Abstraction<IScheduleUnpublishEntryUseCase>;
19
+ export declare namespace ScheduleUnpublishEntryUseCase {
20
+ type Interface = IScheduleUnpublishEntryUseCase;
21
+ type Error = ScheduleActionError;
22
+ type Params = IScheduleUnpublishEntryUseCaseParams;
23
+ type Result = IScheduleUnpublishEntryUseCaseResponse;
24
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const ScheduleUnpublishEntryUseCase = createAbstraction("CmsScheduler/ScheduleUnpublishEntryUseCase");
3
+ export { ScheduleUnpublishEntryUseCase };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ScheduleUnpublishEntryUseCase/abstractions.js","sources":["../../../src/features/ScheduleUnpublishEntryUseCase/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type {\n IScheduledAction,\n ScheduleActionError\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport interface IScheduleUnpublishEntryUseCaseParams {\n id: string;\n model: Pick<CmsModel, \"modelId\">;\n tenant: string;\n scheduleFor: Date;\n}\n\nexport interface IScheduleUnpublishEntryUseCaseResult {\n scheduledAction: IScheduledAction;\n}\n\nexport type IScheduleUnpublishEntryUseCaseResponse = Promise<\n Result<IScheduleUnpublishEntryUseCaseResult, ScheduleActionError>\n>;\n\nexport interface IScheduleUnpublishEntryUseCase {\n execute(params: IScheduleUnpublishEntryUseCaseParams): IScheduleUnpublishEntryUseCaseResponse;\n}\n\n/** Schedule an entry for future unpublishing. */\nexport const ScheduleUnpublishEntryUseCase = createAbstraction<IScheduleUnpublishEntryUseCase>(\n \"CmsScheduler/ScheduleUnpublishEntryUseCase\"\n);\n\nexport namespace ScheduleUnpublishEntryUseCase {\n export type Interface = IScheduleUnpublishEntryUseCase;\n export type Error = ScheduleActionError;\n export type Params = IScheduleUnpublishEntryUseCaseParams;\n export type Result = IScheduleUnpublishEntryUseCaseResponse;\n}\n"],"names":["ScheduleUnpublishEntryUseCase","createAbstraction"],"mappings":";AA2BO,MAAMA,gCAAgCC,kBACzC"}
@@ -0,0 +1,30 @@
1
+ import { type IScheduledAction, ScheduledActionHandler } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
3
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
4
+ import { GetPublishedEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds";
5
+ import { UnpublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry";
6
+ import type { IScheduledActionPayload } from "../../types.js";
7
+ import type { ScheduledActionType } from "@webiny/api-scheduler/shared/abstractions.js";
8
+ /**
9
+ * Handler for unpublishing CMS entries
10
+ *
11
+ * Handles the "Unpublish" action for CMS entries with namespace pattern: Cms/Entry/{modelId}
12
+ *
13
+ * Unpublishing logic:
14
+ * 1. If entry is not published -> nothing to do (warn)
15
+ * 2. If target entry is published (same revision) -> unpublish it
16
+ * 3. If a different revision is published -> unpublish it anyway
17
+ */
18
+ declare class UnpublishEntryActionHandlerImpl implements ScheduledActionHandler.Interface {
19
+ private getModelUseCase;
20
+ private getEntryByIdUseCase;
21
+ private getPublishedEntriesByIdsUseCase;
22
+ private unpublishEntryUseCase;
23
+ constructor(getModelUseCase: GetModelUseCase.Interface, getEntryByIdUseCase: GetEntryByIdUseCase.Interface, getPublishedEntriesByIdsUseCase: GetPublishedEntriesByIdsUseCase.Interface, unpublishEntryUseCase: UnpublishEntryUseCase.Interface);
24
+ canHandle(namespace: string, actionType: ScheduledActionType): boolean;
25
+ handle(action: IScheduledAction<IScheduledActionPayload>): Promise<void>;
26
+ }
27
+ export declare const UnpublishEntryActionHandler: typeof UnpublishEntryActionHandlerImpl & {
28
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-scheduler/shared/abstractions.js").IScheduledActionHandler>;
29
+ };
30
+ export {};
@@ -0,0 +1,69 @@
1
+ import { ScheduledActionHandler, ScheduledActionTypeUnpublish } from "@webiny/api-scheduler/exports/api/scheduler.js";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
3
+ import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
4
+ import { GetPublishedEntriesByIdsUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds";
5
+ import { UnpublishEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry";
6
+ import { extractModelIdFromNamespace } from "../../utils/namespace.js";
7
+ class UnpublishEntryActionHandlerImpl {
8
+ constructor(getModelUseCase, getEntryByIdUseCase, getPublishedEntriesByIdsUseCase, unpublishEntryUseCase){
9
+ this.getModelUseCase = getModelUseCase;
10
+ this.getEntryByIdUseCase = getEntryByIdUseCase;
11
+ this.getPublishedEntriesByIdsUseCase = getPublishedEntriesByIdsUseCase;
12
+ this.unpublishEntryUseCase = unpublishEntryUseCase;
13
+ }
14
+ canHandle(namespace, actionType) {
15
+ const modelId = extractModelIdFromNamespace(namespace);
16
+ if (!modelId) return false;
17
+ return actionType === ScheduledActionTypeUnpublish;
18
+ }
19
+ async handle(action) {
20
+ const { payload } = action;
21
+ const modelId = payload.modelId;
22
+ const modelResult = await this.getModelUseCase.execute(modelId);
23
+ if (modelResult.isFail()) {
24
+ console.error(`Failed to get model "${modelId}" for scheduled unpublish action:`, modelResult.error);
25
+ throw new Error(`Model not found: ${modelId}`);
26
+ }
27
+ const model = modelResult.value;
28
+ const targetEntryResult = await this.getEntryByIdUseCase.execute(model, action.targetId);
29
+ if (targetEntryResult.isFail()) {
30
+ console.error(`Failed to get entry "${action.targetId}" for scheduled unpublish action:`, targetEntryResult.error);
31
+ throw new Error(`Entry not found: ${action.targetId}`);
32
+ }
33
+ const targetEntry = targetEntryResult.value;
34
+ const publishedEntriesResult = await this.getPublishedEntriesByIdsUseCase.execute(model, [
35
+ targetEntry.id
36
+ ]);
37
+ if (publishedEntriesResult.isFail()) {
38
+ console.error(`Failed to get published entries for "${targetEntry.id}":`, publishedEntriesResult.error);
39
+ throw new Error("Failed to check published entries");
40
+ }
41
+ const [publishedTargetEntry] = publishedEntriesResult.value;
42
+ if (!publishedTargetEntry) return void console.warn(`Entry "${action.targetId}" is not published, nothing to unpublish.`);
43
+ if (publishedTargetEntry.id === action.targetId) {
44
+ const unpublishResult = await this.unpublishEntryUseCase.execute(model, action.targetId);
45
+ if (unpublishResult.isFail()) {
46
+ console.error(`Failed to unpublish entry "${action.targetId}":`, unpublishResult.error);
47
+ throw new Error(`Failed to unpublish entry: ${action.targetId}`);
48
+ }
49
+ return;
50
+ }
51
+ const unpublishResult = await this.unpublishEntryUseCase.execute(model, publishedTargetEntry.id);
52
+ if (unpublishResult.isFail()) {
53
+ console.error(`Failed to unpublish published revision "${publishedTargetEntry.id}":`, unpublishResult.error);
54
+ throw new Error(`Failed to unpublish entry: ${publishedTargetEntry.id}`);
55
+ }
56
+ }
57
+ }
58
+ const UnpublishEntryActionHandler = ScheduledActionHandler.createImplementation({
59
+ implementation: UnpublishEntryActionHandlerImpl,
60
+ dependencies: [
61
+ GetModelUseCase,
62
+ GetEntryByIdUseCase,
63
+ GetPublishedEntriesByIdsUseCase,
64
+ UnpublishEntryUseCase
65
+ ]
66
+ });
67
+ export { UnpublishEntryActionHandler };
68
+
69
+ //# sourceMappingURL=UnpublishEntryActionHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/UnpublishActionHandler/UnpublishEntryActionHandler.js","sources":["../../../src/features/UnpublishActionHandler/UnpublishEntryActionHandler.ts"],"sourcesContent":["import {\n type IScheduledAction,\n ScheduledActionHandler,\n ScheduledActionTypeUnpublish\n} from \"@webiny/api-scheduler/exports/api/scheduler.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { GetPublishedEntriesByIdsUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetPublishedEntriesByIds\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry\";\nimport type { IScheduledActionPayload } from \"~/types.js\";\nimport { extractModelIdFromNamespace } from \"~/utils/namespace.js\";\nimport type { ScheduledActionType } from \"@webiny/api-scheduler/shared/abstractions.js\";\n\n/**\n * Handler for unpublishing CMS entries\n *\n * Handles the \"Unpublish\" action for CMS entries with namespace pattern: Cms/Entry/{modelId}\n *\n * Unpublishing logic:\n * 1. If entry is not published -> nothing to do (warn)\n * 2. If target entry is published (same revision) -> unpublish it\n * 3. If a different revision is published -> unpublish it anyway\n */\nclass UnpublishEntryActionHandlerImpl implements ScheduledActionHandler.Interface {\n constructor(\n private getModelUseCase: GetModelUseCase.Interface,\n private getEntryByIdUseCase: GetEntryByIdUseCase.Interface,\n private getPublishedEntriesByIdsUseCase: GetPublishedEntriesByIdsUseCase.Interface,\n private unpublishEntryUseCase: UnpublishEntryUseCase.Interface\n ) {}\n\n canHandle(namespace: string, actionType: ScheduledActionType): boolean {\n const modelId = extractModelIdFromNamespace(namespace);\n if (!modelId) {\n return false;\n }\n return actionType === ScheduledActionTypeUnpublish;\n }\n\n async handle(action: IScheduledAction<IScheduledActionPayload>): Promise<void> {\n const { payload } = action;\n\n const modelId = payload.modelId as string;\n\n // Fetch the model\n const modelResult = await this.getModelUseCase.execute(modelId);\n if (modelResult.isFail()) {\n console.error(\n `Failed to get model \"${modelId}\" for scheduled unpublish action:`,\n modelResult.error\n );\n throw new Error(`Model not found: ${modelId}`);\n }\n\n const model = modelResult.value;\n\n // Fetch the target entry\n const targetEntryResult = await this.getEntryByIdUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, action.targetId);\n if (targetEntryResult.isFail()) {\n console.error(\n `Failed to get entry \"${action.targetId}\" for scheduled unpublish action:`,\n targetEntryResult.error\n );\n throw new Error(`Entry not found: ${action.targetId}`);\n }\n\n const targetEntry = targetEntryResult.value;\n\n // Get published entries\n const publishedEntriesResult = await this.getPublishedEntriesByIdsUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, [targetEntry.id]);\n\n if (publishedEntriesResult.isFail()) {\n console.error(\n `Failed to get published entries for \"${targetEntry.id}\":`,\n publishedEntriesResult.error\n );\n throw new Error(`Failed to check published entries`);\n }\n\n const [publishedTargetEntry] = publishedEntriesResult.value;\n\n /**\n * Scenario 1: Entry is not published -> nothing to do\n */\n if (!publishedTargetEntry) {\n console.warn(`Entry \"${action.targetId}\" is not published, nothing to unpublish.`);\n return;\n }\n\n /**\n * Scenario 2: Target entry is published (same revision) -> unpublish it\n */\n if (publishedTargetEntry.id === action.targetId) {\n const unpublishResult = await this.unpublishEntryUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, action.targetId);\n if (unpublishResult.isFail()) {\n console.error(\n `Failed to unpublish entry \"${action.targetId}\":`,\n unpublishResult.error\n );\n throw new Error(`Failed to unpublish entry: ${action.targetId}`);\n }\n return;\n }\n\n /**\n * Scenario 3: A different revision is published -> unpublish it anyway\n * TODO: Determine if we really want to unpublish an entry which does not match the target ID\n */\n const unpublishResult = await this.unpublishEntryUseCase.execute<\n IScheduledAction<IScheduledActionPayload>\n >(model, publishedTargetEntry.id);\n if (unpublishResult.isFail()) {\n console.error(\n `Failed to unpublish published revision \"${publishedTargetEntry.id}\":`,\n unpublishResult.error\n );\n throw new Error(`Failed to unpublish entry: ${publishedTargetEntry.id}`);\n }\n }\n}\n\nexport const UnpublishEntryActionHandler = ScheduledActionHandler.createImplementation({\n implementation: UnpublishEntryActionHandlerImpl,\n dependencies: [\n GetModelUseCase,\n GetEntryByIdUseCase,\n GetPublishedEntriesByIdsUseCase,\n UnpublishEntryUseCase\n ]\n});\n"],"names":["UnpublishEntryActionHandlerImpl","getModelUseCase","getEntryByIdUseCase","getPublishedEntriesByIdsUseCase","unpublishEntryUseCase","namespace","actionType","modelId","extractModelIdFromNamespace","ScheduledActionTypeUnpublish","action","payload","modelResult","console","Error","model","targetEntryResult","targetEntry","publishedEntriesResult","publishedTargetEntry","unpublishResult","UnpublishEntryActionHandler","ScheduledActionHandler","GetModelUseCase","GetEntryByIdUseCase","GetPublishedEntriesByIdsUseCase","UnpublishEntryUseCase"],"mappings":";;;;;;AAuBA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,mBAAkD,EAClDC,+BAA0E,EAC1EC,qBAAsD,CAChE;aAJUH,eAAe,GAAfA;aACAC,mBAAmB,GAAnBA;aACAC,+BAA+B,GAA/BA;aACAC,qBAAqB,GAArBA;IACT;IAEH,UAAUC,SAAiB,EAAEC,UAA+B,EAAW;QACnE,MAAMC,UAAUC,4BAA4BH;QAC5C,IAAI,CAACE,SACD,OAAO;QAEX,OAAOD,eAAeG;IAC1B;IAEA,MAAM,OAAOC,MAAiD,EAAiB;QAC3E,MAAM,EAAEC,OAAO,EAAE,GAAGD;QAEpB,MAAMH,UAAUI,QAAQ,OAAO;QAG/B,MAAMC,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAACL;QACvD,IAAIK,YAAY,MAAM,IAAI;YACtBC,QAAQ,KAAK,CACT,CAAC,qBAAqB,EAAEN,QAAQ,iCAAiC,CAAC,EAClEK,YAAY,KAAK;YAErB,MAAM,IAAIE,MAAM,CAAC,iBAAiB,EAAEP,SAAS;QACjD;QAEA,MAAMQ,QAAQH,YAAY,KAAK;QAG/B,MAAMI,oBAAoB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAE9DD,OAAOL,OAAO,QAAQ;QACxB,IAAIM,kBAAkB,MAAM,IAAI;YAC5BH,QAAQ,KAAK,CACT,CAAC,qBAAqB,EAAEH,OAAO,QAAQ,CAAC,iCAAiC,CAAC,EAC1EM,kBAAkB,KAAK;YAE3B,MAAM,IAAIF,MAAM,CAAC,iBAAiB,EAAEJ,OAAO,QAAQ,EAAE;QACzD;QAEA,MAAMO,cAAcD,kBAAkB,KAAK;QAG3C,MAAME,yBAAyB,MAAM,IAAI,CAAC,+BAA+B,CAAC,OAAO,CAE/EH,OAAO;YAACE,YAAY,EAAE;SAAC;QAEzB,IAAIC,uBAAuB,MAAM,IAAI;YACjCL,QAAQ,KAAK,CACT,CAAC,qCAAqC,EAAEI,YAAY,EAAE,CAAC,EAAE,CAAC,EAC1DC,uBAAuB,KAAK;YAEhC,MAAM,IAAIJ,MAAM;QACpB;QAEA,MAAM,CAACK,qBAAqB,GAAGD,uBAAuB,KAAK;QAK3D,IAAI,CAACC,sBAAsB,YACvBN,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAEH,OAAO,QAAQ,CAAC,yCAAyC,CAAC;QAOrF,IAAIS,qBAAqB,EAAE,KAAKT,OAAO,QAAQ,EAAE;YAC7C,MAAMU,kBAAkB,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAE9DL,OAAOL,OAAO,QAAQ;YACxB,IAAIU,gBAAgB,MAAM,IAAI;gBAC1BP,QAAQ,KAAK,CACT,CAAC,2BAA2B,EAAEH,OAAO,QAAQ,CAAC,EAAE,CAAC,EACjDU,gBAAgB,KAAK;gBAEzB,MAAM,IAAIN,MAAM,CAAC,2BAA2B,EAAEJ,OAAO,QAAQ,EAAE;YACnE;YACA;QACJ;QAMA,MAAMU,kBAAkB,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAE9DL,OAAOI,qBAAqB,EAAE;QAChC,IAAIC,gBAAgB,MAAM,IAAI;YAC1BP,QAAQ,KAAK,CACT,CAAC,wCAAwC,EAAEM,qBAAqB,EAAE,CAAC,EAAE,CAAC,EACtEC,gBAAgB,KAAK;YAEzB,MAAM,IAAIN,MAAM,CAAC,2BAA2B,EAAEK,qBAAqB,EAAE,EAAE;QAC3E;IACJ;AACJ;AAEO,MAAME,8BAA8BC,uBAAuB,oBAAoB,CAAC;IACnF,gBAAgBtB;IAChB,cAAc;QACVuB;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,13 @@
1
+ import { SchedulerPermissions } from "@webiny/api-scheduler/features/permissions/abstractions.js";
2
+ import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
3
+ declare class CmsSchedulerPermissionsImpl implements SchedulerPermissions.Interface {
4
+ private identityContext;
5
+ constructor(identityContext: IdentityContext.Interface);
6
+ canHandle(namespace: string): boolean;
7
+ canRead(): Promise<boolean>;
8
+ onlyOwnRecords(): Promise<boolean>;
9
+ }
10
+ export declare const CmsSchedulerPermissions: typeof CmsSchedulerPermissionsImpl & {
11
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-scheduler/features/permissions/abstractions.js").ISchedulerPermissions>;
12
+ };
13
+ export {};
@@ -0,0 +1,31 @@
1
+ import { SchedulerPermissions } from "@webiny/api-scheduler/features/permissions/abstractions.js";
2
+ import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
3
+ import { CMS_NAMESPACE } from "../../utils/namespace.js";
4
+ class CmsSchedulerPermissionsImpl {
5
+ constructor(identityContext){
6
+ this.identityContext = identityContext;
7
+ }
8
+ canHandle(namespace) {
9
+ return namespace.startsWith(CMS_NAMESPACE);
10
+ }
11
+ async canRead() {
12
+ if (await this.identityContext.hasFullAccess()) return true;
13
+ const permissions = await this.identityContext.getPermissions("cms.contentEntry");
14
+ return permissions.length > 0;
15
+ }
16
+ async onlyOwnRecords() {
17
+ if (await this.identityContext.hasFullAccess()) return false;
18
+ const permissions = await this.identityContext.getPermissions("cms.contentEntry");
19
+ if (!permissions.length) return false;
20
+ return !permissions.some((p)=>!p.own);
21
+ }
22
+ }
23
+ const CmsSchedulerPermissions = SchedulerPermissions.createImplementation({
24
+ implementation: CmsSchedulerPermissionsImpl,
25
+ dependencies: [
26
+ IdentityContext
27
+ ]
28
+ });
29
+ export { CmsSchedulerPermissions };
30
+
31
+ //# sourceMappingURL=CmsSchedulerPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/permissions/CmsSchedulerPermissions.js","sources":["../../../src/features/permissions/CmsSchedulerPermissions.ts"],"sourcesContent":["import { SchedulerPermissions } from \"@webiny/api-scheduler/features/permissions/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { CMS_NAMESPACE } from \"~/utils/namespace.js\";\n\nclass CmsSchedulerPermissionsImpl implements SchedulerPermissions.Interface {\n constructor(private identityContext: IdentityContext.Interface) {}\n\n canHandle(namespace: string): boolean {\n return namespace.startsWith(CMS_NAMESPACE);\n }\n\n async canRead(): Promise<boolean> {\n if (await this.identityContext.hasFullAccess()) {\n return true;\n }\n const permissions = await this.identityContext.getPermissions(\"cms.contentEntry\");\n return permissions.length > 0;\n }\n\n async onlyOwnRecords(): Promise<boolean> {\n if (await this.identityContext.hasFullAccess()) {\n return false;\n }\n const permissions = await this.identityContext.getPermissions(\"cms.contentEntry\");\n if (!permissions.length) {\n return false;\n }\n return !permissions.some((p: any) => !p.own);\n }\n}\n\nexport const CmsSchedulerPermissions = SchedulerPermissions.createImplementation({\n implementation: CmsSchedulerPermissionsImpl,\n dependencies: [IdentityContext]\n});\n"],"names":["CmsSchedulerPermissionsImpl","identityContext","namespace","CMS_NAMESPACE","permissions","p","CmsSchedulerPermissions","SchedulerPermissions","IdentityContext"],"mappings":";;;AAIA,MAAMA;IACF,YAAoBC,eAA0C,CAAE;aAA5CA,eAAe,GAAfA;IAA6C;IAEjE,UAAUC,SAAiB,EAAW;QAClC,OAAOA,UAAU,UAAU,CAACC;IAChC;IAEA,MAAM,UAA4B;QAC9B,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,IACxC,OAAO;QAEX,MAAMC,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;QAC9D,OAAOA,YAAY,MAAM,GAAG;IAChC;IAEA,MAAM,iBAAmC;QACrC,IAAI,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,IACxC,OAAO;QAEX,MAAMA,cAAc,MAAM,IAAI,CAAC,eAAe,CAAC,cAAc,CAAC;QAC9D,IAAI,CAACA,YAAY,MAAM,EACnB,OAAO;QAEX,OAAO,CAACA,YAAY,IAAI,CAAC,CAACC,IAAW,CAACA,EAAE,GAAG;IAC/C;AACJ;AAEO,MAAMC,0BAA0BC,qBAAqB,oBAAoB,CAAC;IAC7E,gBAAgBP;IAChB,cAAc;QAACQ;KAAgB;AACnC"}
package/index.d.ts ADDED
@@ -0,0 +1 @@
1
+ export { CmsSchedulerFeature } from "./CmsSchedulerFeature.js";
package/index.js ADDED
@@ -0,0 +1 @@
1
+ export { CmsSchedulerFeature } from "./CmsSchedulerFeature.js";
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@webiny/api-headless-cms-scheduler",
3
+ "version": "0.0.0-unstable.0156a4c312",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
9
+ "description": "Schedule for Webiny Headless CMS",
10
+ "keywords": [
11
+ "api-headless-cms-scheduler:base"
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/webiny/webiny-js.git",
16
+ "directory": "packages/api-headless-cms-scheduler"
17
+ },
18
+ "license": "MIT",
19
+ "dependencies": {
20
+ "@webiny/api": "0.0.0-unstable.0156a4c312",
21
+ "@webiny/api-headless-cms": "0.0.0-unstable.0156a4c312",
22
+ "@webiny/api-scheduler": "0.0.0-unstable.0156a4c312",
23
+ "@webiny/feature": "0.0.0-unstable.0156a4c312"
24
+ },
25
+ "devDependencies": {
26
+ "@webiny/api-core": "0.0.0-unstable.0156a4c312",
27
+ "@webiny/api-headless-cms-testing": "0.0.0-unstable.0156a4c312",
28
+ "@webiny/api-opensearch": "0.0.0-unstable.0156a4c312",
29
+ "@webiny/build-tools": "0.0.0-unstable.0156a4c312",
30
+ "@webiny/wcp": "0.0.0-unstable.0156a4c312",
31
+ "typescript": "7.0.2",
32
+ "vitest": "5.0.5"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "webiny": {
38
+ "publishFrom": "dist"
39
+ }
40
+ }
package/types.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ import type { INamespaceHandlerResult } from "@webiny/api-scheduler/features/NamespaceHandler/abstractions.js";
2
+ export interface IScheduledActionPayload extends INamespaceHandlerResult {
3
+ modelId: string;
4
+ }
package/types.js ADDED
File without changes
@@ -0,0 +1,4 @@
1
+ import type { CmsModel } from "@webiny/api-headless-cms/types/index.js";
2
+ export declare const CMS_NAMESPACE = "Cms/Entry/";
3
+ export declare const createNamespace: (model: Pick<CmsModel, "modelId">) => string;
4
+ export declare const extractModelIdFromNamespace: (namespace: string) => string | null;
@@ -0,0 +1,9 @@
1
+ const CMS_NAMESPACE = "Cms/Entry/";
2
+ const createNamespace = (model)=>`${CMS_NAMESPACE}${model.modelId}`;
3
+ const extractModelIdFromNamespace = (namespace)=>{
4
+ if (!namespace.startsWith(CMS_NAMESPACE)) return null;
5
+ return namespace.substring(CMS_NAMESPACE.length) || null;
6
+ };
7
+ export { CMS_NAMESPACE, createNamespace, extractModelIdFromNamespace };
8
+
9
+ //# sourceMappingURL=namespace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils/namespace.js","sources":["../../src/utils/namespace.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport const CMS_NAMESPACE = \"Cms/Entry/\";\n\nexport const createNamespace = (model: Pick<CmsModel, \"modelId\">) => {\n return `${CMS_NAMESPACE}${model.modelId}`;\n};\n\nexport const extractModelIdFromNamespace = (namespace: string): string | null => {\n if (!namespace.startsWith(CMS_NAMESPACE)) {\n return null;\n }\n return namespace.substring(CMS_NAMESPACE.length) || null;\n};\n"],"names":["CMS_NAMESPACE","createNamespace","model","extractModelIdFromNamespace","namespace"],"mappings":"AAEO,MAAMA,gBAAgB;AAEtB,MAAMC,kBAAkB,CAACC,QACrB,GAAGF,gBAAgBE,MAAM,OAAO,EAAE;AAGtC,MAAMC,8BAA8B,CAACC;IACxC,IAAI,CAACA,UAAU,UAAU,CAACJ,gBACtB,OAAO;IAEX,OAAOI,UAAU,SAAS,CAACJ,cAAc,MAAM,KAAK;AACxD"}