@webiny/api-headless-cms-scheduler 6.0.0-alpha.5 → 6.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -15
- package/context.d.ts +2 -7
- package/context.js +9 -64
- package/context.js.map +1 -1
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.d.ts +20 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.js +51 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnEntryDeleteEventHandler.js.map +1 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.d.ts +19 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js +48 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js.map +1 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.d.ts +19 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.js +47 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnRevisionDeleteEventHandler.js.map +1 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.d.ts +19 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js +48 -0
- package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js.map +1 -0
- package/features/CancelScheduledActionOnEntryChange/feature.d.ts +8 -0
- package/features/CancelScheduledActionOnEntryChange/feature.js +24 -0
- package/features/CancelScheduledActionOnEntryChange/feature.js.map +1 -0
- package/features/CancelScheduledEntryAction/CancelScheduledEntryActionUseCase.d.ts +15 -0
- package/features/CancelScheduledEntryAction/CancelScheduledEntryActionUseCase.js +25 -0
- package/features/CancelScheduledEntryAction/CancelScheduledEntryActionUseCase.js.map +1 -0
- package/features/CancelScheduledEntryAction/abstractions.d.ts +22 -0
- package/features/CancelScheduledEntryAction/abstractions.js +11 -0
- package/features/CancelScheduledEntryAction/abstractions.js.map +1 -0
- package/features/CancelScheduledEntryAction/feature.d.ts +6 -0
- package/features/CancelScheduledEntryAction/feature.js +16 -0
- package/features/CancelScheduledEntryAction/feature.js.map +1 -0
- package/features/CancelScheduledEntryAction/index.d.ts +1 -0
- package/features/CancelScheduledEntryAction/index.js +3 -0
- package/features/CancelScheduledEntryAction/index.js.map +1 -0
- package/features/ScheduleEntryAction/ScheduleEntryActionUseCase.d.ts +27 -0
- package/features/ScheduleEntryAction/ScheduleEntryActionUseCase.js +83 -0
- package/features/ScheduleEntryAction/ScheduleEntryActionUseCase.js.map +1 -0
- package/features/ScheduleEntryAction/abstractions.d.ts +45 -0
- package/features/ScheduleEntryAction/abstractions.js +15 -0
- package/features/ScheduleEntryAction/abstractions.js.map +1 -0
- package/features/ScheduleEntryAction/actionHandlers/PublishEntryActionHandler.d.ts +35 -0
- package/features/ScheduleEntryAction/actionHandlers/PublishEntryActionHandler.js +109 -0
- package/features/ScheduleEntryAction/actionHandlers/PublishEntryActionHandler.js.map +1 -0
- package/features/ScheduleEntryAction/actionHandlers/UnpublishEntryActionHandler.d.ts +29 -0
- package/features/ScheduleEntryAction/actionHandlers/UnpublishEntryActionHandler.js +92 -0
- package/features/ScheduleEntryAction/actionHandlers/UnpublishEntryActionHandler.js.map +1 -0
- package/features/ScheduleEntryAction/feature.d.ts +7 -0
- package/features/ScheduleEntryAction/feature.js +21 -0
- package/features/ScheduleEntryAction/feature.js.map +1 -0
- package/features/ScheduleEntryAction/index.d.ts +1 -0
- package/features/ScheduleEntryAction/index.js +3 -0
- package/features/ScheduleEntryAction/index.js.map +1 -0
- package/graphql/ActionMapper.d.ts +15 -0
- package/graphql/ActionMapper.js +18 -0
- package/graphql/ActionMapper.js.map +1 -0
- package/{scheduler → graphql}/dates.d.ts +1 -2
- package/graphql/dates.js +9 -0
- package/graphql/dates.js.map +1 -0
- package/graphql/index.d.ts +2 -2
- package/graphql/index.js +113 -71
- package/graphql/index.js.map +1 -1
- package/graphql/schema.d.ts +93 -148
- package/graphql/schema.js +51 -55
- package/graphql/schema.js.map +1 -1
- package/index.d.ts +3 -7
- package/index.js +5 -22
- package/index.js.map +1 -1
- package/package.json +20 -22
- package/constants.d.ts +0 -11
- package/constants.js +0 -19
- package/constants.js.map +0 -1
- package/handler/Handler.d.ts +0 -23
- package/handler/Handler.js +0 -74
- package/handler/Handler.js.map +0 -1
- package/handler/actions/PublishHandlerAction.d.ts +0 -13
- package/handler/actions/PublishHandlerAction.js +0 -64
- package/handler/actions/PublishHandlerAction.js.map +0 -1
- package/handler/actions/UnpublishHandlerAction.d.ts +0 -13
- package/handler/actions/UnpublishHandlerAction.js +0 -53
- package/handler/actions/UnpublishHandlerAction.js.map +0 -1
- package/handler/index.d.ts +0 -7
- package/handler/index.js +0 -64
- package/handler/index.js.map +0 -1
- package/handler/types.d.ts +0 -5
- package/handler/types.js +0 -7
- package/handler/types.js.map +0 -1
- package/hooks/index.d.ts +0 -7
- package/hooks/index.js +0 -58
- package/hooks/index.js.map +0 -1
- package/manifest.d.ts +0 -17
- package/manifest.js +0 -47
- package/manifest.js.map +0 -1
- package/scheduler/ScheduleExecutor.d.ts +0 -16
- package/scheduler/ScheduleExecutor.js +0 -55
- package/scheduler/ScheduleExecutor.js.map +0 -1
- package/scheduler/ScheduleFetcher.d.ts +0 -16
- package/scheduler/ScheduleFetcher.js +0 -51
- package/scheduler/ScheduleFetcher.js.map +0 -1
- package/scheduler/ScheduleRecord.d.ts +0 -31
- package/scheduler/ScheduleRecord.js +0 -57
- package/scheduler/ScheduleRecord.js.map +0 -1
- package/scheduler/Scheduler.d.ts +0 -14
- package/scheduler/Scheduler.js +0 -27
- package/scheduler/Scheduler.js.map +0 -1
- package/scheduler/actions/PublishScheduleAction.d.ts +0 -26
- package/scheduler/actions/PublishScheduleAction.js +0 -196
- package/scheduler/actions/PublishScheduleAction.js.map +0 -1
- package/scheduler/actions/UnpublishScheduleAction.d.ts +0 -26
- package/scheduler/actions/UnpublishScheduleAction.js +0 -194
- package/scheduler/actions/UnpublishScheduleAction.js.map +0 -1
- package/scheduler/createScheduleRecordId.d.ts +0 -2
- package/scheduler/createScheduleRecordId.js +0 -33
- package/scheduler/createScheduleRecordId.js.map +0 -1
- package/scheduler/createScheduler.d.ts +0 -12
- package/scheduler/createScheduler.js +0 -65
- package/scheduler/createScheduler.js.map +0 -1
- package/scheduler/dates.js +0 -27
- package/scheduler/dates.js.map +0 -1
- package/scheduler/model.d.ts +0 -1
- package/scheduler/model.js +0 -88
- package/scheduler/model.js.map +0 -1
- package/scheduler/types.d.ts +0 -88
- package/scheduler/types.js +0 -19
- package/scheduler/types.js.map +0 -1
- package/service/SchedulerService.d.ts +0 -23
- package/service/SchedulerService.js +0 -151
- package/service/SchedulerService.js.map +0 -1
- package/service/types.d.ts +0 -19
- package/service/types.js +0 -7
- package/service/types.js.map +0 -1
- package/types.d.ts +0 -11
- package/types.js +0 -7
- package/types.js.map +0 -1
- package/utils/dateInTheFuture.d.ts +0 -6
- package/utils/dateInTheFuture.js +0 -19
- package/utils/dateInTheFuture.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
# @webiny/api-headless-cms-
|
|
2
|
-
|
|
3
|
-
[!
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
Or if you prefer yarn:
|
|
13
|
-
```
|
|
14
|
-
yarn add @webiny/api-headless-cms-schedule
|
|
15
|
-
```
|
|
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._
|
package/context.d.ts
CHANGED
|
@@ -1,7 +1,2 @@
|
|
|
1
|
-
import { ContextPlugin } from "@webiny/api
|
|
2
|
-
|
|
3
|
-
import type { ScheduleContext } from "./types.js";
|
|
4
|
-
export interface ICreateHeadlessCmsSchedulerContextParams {
|
|
5
|
-
getClient(config?: SchedulerClientConfig): Pick<SchedulerClient, "send">;
|
|
6
|
-
}
|
|
7
|
-
export declare const createHeadlessCmsScheduleContext: (params: ICreateHeadlessCmsSchedulerContextParams) => ContextPlugin<ScheduleContext>;
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
export declare const createHeadlessCmsScheduleContext: () => ContextPlugin<import("@webiny/api/types").Context>;
|
package/context.js
CHANGED
|
@@ -1,68 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
var _utils = require("@webiny/utils");
|
|
11
|
-
var _createScheduler = require("./scheduler/createScheduler.js");
|
|
12
|
-
var _handlerGraphql = require("@webiny/handler-graphql");
|
|
13
|
-
var _constants = require("./constants.js");
|
|
14
|
-
var _apiHeadlessCms = require("@webiny/api-headless-cms");
|
|
15
|
-
var _index2 = require("./hooks/index.js");
|
|
16
|
-
const createHeadlessCmsScheduleContext = params => {
|
|
17
|
-
return new _index.ContextPlugin(async context => {
|
|
18
|
-
/**
|
|
19
|
-
* If the Headless CMS is not ready, it means the system is not fully installed yet.
|
|
20
|
-
* We do not want to continue because it would break anyway.
|
|
21
|
-
*/
|
|
22
|
-
const ready = await (0, _apiHeadlessCms.isHeadlessCmsReady)(context);
|
|
23
|
-
if (!ready) {
|
|
24
|
-
return;
|
|
25
|
-
}
|
|
26
|
-
const manifest = await (0, _manifest.getManifest)({
|
|
27
|
-
client: context.db.driver.getClient()
|
|
28
|
-
});
|
|
29
|
-
if (manifest.error) {
|
|
30
|
-
console.error(manifest.error.message);
|
|
31
|
-
console.log((0, _utils.convertException)(manifest.error, ["message"]));
|
|
32
|
-
console.info("Scheduler not attached.");
|
|
33
|
-
return;
|
|
34
|
-
}
|
|
35
|
-
const service = (0, _SchedulerService.createSchedulerService)({
|
|
36
|
-
getClient: params.getClient,
|
|
37
|
-
config: {
|
|
38
|
-
lambdaArn: manifest.data.lambdaArn,
|
|
39
|
-
roleArn: manifest.data.roleArn
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
let schedulerModel;
|
|
43
|
-
try {
|
|
44
|
-
schedulerModel = await context.cms.getModel(_constants.SCHEDULE_MODEL_ID);
|
|
45
|
-
} catch (ex) {
|
|
46
|
-
if (ex.code === "NOT_FOUND" || ex instanceof _handlerGraphql.NotFoundError) {
|
|
47
|
-
console.error(`Schedule model "${_constants.SCHEDULE_MODEL_ID}" not found.`);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
console.error(`Error while fetching schedule model "${_constants.SCHEDULE_MODEL_ID}".`);
|
|
51
|
-
console.log((0, _utils.convertException)(ex));
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
(0, _index2.attachLifecycleHooks)({
|
|
55
|
-
cms: context.cms,
|
|
56
|
-
schedulerModel
|
|
57
|
-
});
|
|
58
|
-
context.cms.scheduler = await (0, _createScheduler.createScheduler)({
|
|
59
|
-
cms: context.cms,
|
|
60
|
-
security: context.security,
|
|
61
|
-
service,
|
|
62
|
-
schedulerModel
|
|
63
|
-
});
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
import { ScheduleEntryActionFeature } from "./features/ScheduleEntryAction/feature.js";
|
|
3
|
+
import { CancelScheduledEntryActionFeature } from "./features/CancelScheduledEntryAction/feature.js";
|
|
4
|
+
import { CancelScheduledActionOnEntryChangeFeature } from "./features/CancelScheduledActionOnEntryChange/feature.js";
|
|
5
|
+
export const createHeadlessCmsScheduleContext = () => {
|
|
6
|
+
return new ContextPlugin(async context => {
|
|
7
|
+
ScheduleEntryActionFeature.register(context.container);
|
|
8
|
+
CancelScheduledEntryActionFeature.register(context.container);
|
|
9
|
+
CancelScheduledActionOnEntryChangeFeature.register(context.container);
|
|
64
10
|
});
|
|
65
11
|
};
|
|
66
|
-
exports.createHeadlessCmsScheduleContext = createHeadlessCmsScheduleContext;
|
|
67
12
|
|
|
68
13
|
//# sourceMappingURL=context.js.map
|
package/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["ContextPlugin","ScheduleEntryActionFeature","CancelScheduledEntryActionFeature","CancelScheduledActionOnEntryChangeFeature","createHeadlessCmsScheduleContext","context","register","container"],"sources":["context.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { ScheduleEntryActionFeature } from \"~/features/ScheduleEntryAction/feature.js\";\nimport { CancelScheduledEntryActionFeature } from \"~/features/CancelScheduledEntryAction/feature.js\";\nimport { CancelScheduledActionOnEntryChangeFeature } from \"~/features/CancelScheduledActionOnEntryChange/feature.js\";\n\nexport const createHeadlessCmsScheduleContext = () => {\n return new ContextPlugin(async context => {\n ScheduleEntryActionFeature.register(context.container);\n CancelScheduledEntryActionFeature.register(context.container);\n CancelScheduledActionOnEntryChangeFeature.register(context.container);\n });\n};\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,0BAA0B;AACnC,SAASC,iCAAiC;AAC1C,SAASC,yCAAyC;AAElD,OAAO,MAAMC,gCAAgC,GAAGA,CAAA,KAAM;EAClD,OAAO,IAAIJ,aAAa,CAAC,MAAMK,OAAO,IAAI;IACtCJ,0BAA0B,CAACK,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IACtDL,iCAAiC,CAACI,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;IAC7DJ,yCAAyC,CAACG,QAAQ,CAACD,OAAO,CAACE,SAAS,CAAC;EACzE,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
|
|
2
|
+
import { ListScheduledActionsUseCase, CancelScheduledActionUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
/**
|
|
4
|
+
* Cancels scheduled actions when an entry is deleted
|
|
5
|
+
*
|
|
6
|
+
* When a user deletes an entry, any scheduled publish/unpublish
|
|
7
|
+
* actions for all of its revisions should be canceled since the entry
|
|
8
|
+
* no longer exists.
|
|
9
|
+
*/
|
|
10
|
+
declare class CancelScheduledActionOnEntryDeleteHandlerImpl implements EntryAfterDeleteEventHandler.Interface {
|
|
11
|
+
private listScheduledActions;
|
|
12
|
+
private cancelScheduledEntryAction;
|
|
13
|
+
constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledEntryAction: CancelScheduledActionUseCase.Interface);
|
|
14
|
+
handle(event: EntryAfterDeleteEventHandler.Event): Promise<void>;
|
|
15
|
+
private listSchedules;
|
|
16
|
+
}
|
|
17
|
+
export declare const CancelScheduledActionOnEntryDeleteEventHandler: typeof CancelScheduledActionOnEntryDeleteHandlerImpl & {
|
|
18
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events").EntryAfterDeleteEvent>>;
|
|
19
|
+
};
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
|
|
2
|
+
import { ListScheduledActionsUseCase, CancelScheduledActionUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
|
|
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
|
+
class CancelScheduledActionOnEntryDeleteHandlerImpl {
|
|
12
|
+
constructor(listScheduledActions, cancelScheduledEntryAction) {
|
|
13
|
+
this.listScheduledActions = listScheduledActions;
|
|
14
|
+
this.cancelScheduledEntryAction = cancelScheduledEntryAction;
|
|
15
|
+
}
|
|
16
|
+
async handle(event) {
|
|
17
|
+
const {
|
|
18
|
+
entry,
|
|
19
|
+
model
|
|
20
|
+
} = event.payload;
|
|
21
|
+
|
|
22
|
+
// Skip private models
|
|
23
|
+
if (model.isPrivate) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const schedules = await this.listSchedules(model.modelId, entry.entryId);
|
|
27
|
+
for (const action of schedules) {
|
|
28
|
+
const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);
|
|
29
|
+
if (cancelRes.isFail()) {
|
|
30
|
+
// Silently ignore errors - this is non-critical cleanup.
|
|
31
|
+
// The entry was deleted successfully, cancelling scheduled actions is best-effort.
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async listSchedules(modelId, entryId) {
|
|
36
|
+
const actionsResult = await this.listScheduledActions.execute({
|
|
37
|
+
limit: 10000,
|
|
38
|
+
where: {
|
|
39
|
+
namespace: `Cms/Entry/${modelId}`,
|
|
40
|
+
targetId_startsWith: `${entryId}#`
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return actionsResult.value.items;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export const CancelScheduledActionOnEntryDeleteEventHandler = EntryAfterDeleteEventHandler.createImplementation({
|
|
47
|
+
implementation: CancelScheduledActionOnEntryDeleteHandlerImpl,
|
|
48
|
+
dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase]
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=CancelScheduledActionOnEntryDeleteEventHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryAfterDeleteEventHandler","ListScheduledActionsUseCase","CancelScheduledActionUseCase","CancelScheduledActionOnEntryDeleteHandlerImpl","constructor","listScheduledActions","cancelScheduledEntryAction","handle","event","entry","model","payload","isPrivate","schedules","listSchedules","modelId","entryId","action","cancelRes","execute","id","isFail","actionsResult","limit","where","namespace","targetId_startsWith","value","items","CancelScheduledActionOnEntryDeleteEventHandler","createImplementation","implementation","dependencies"],"sources":["CancelScheduledActionOnEntryDeleteEventHandler.ts"],"sourcesContent":["import { EntryAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events\";\nimport { ListScheduledActionsUseCase, CancelScheduledActionUseCase } from \"@webiny/api-scheduler\";\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 cancelScheduledEntryAction: CancelScheduledActionUseCase.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.cancelScheduledEntryAction.execute(action.id);\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: `Cms/Entry/${modelId}`,\n targetId_startsWith: `${entryId}#`\n }\n });\n\n return actionsResult.value.items;\n }\n}\n\nexport const CancelScheduledActionOnEntryDeleteEventHandler =\n EntryAfterDeleteEventHandler.createImplementation({\n implementation: CancelScheduledActionOnEntryDeleteHandlerImpl,\n dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase]\n });\n"],"mappings":"AAAA,SAASA,4BAA4B,QAAQ,mEAAmE;AAChH,SAASC,2BAA2B,EAAEC,4BAA4B,QAAQ,uBAAuB;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,6CAA6C,CAEnD;EACIC,WAAWA,CACCC,oBAA2D,EAC3DC,0BAAkE,EAC5E;IAAA,KAFUD,oBAA2D,GAA3DA,oBAA2D;IAAA,KAC3DC,0BAAkE,GAAlEA,0BAAkE;EAC3E;EAEH,MAAMC,MAAMA,CAACC,KAAyC,EAAiB;IACnE,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGF,KAAK,CAACG,OAAO;;IAEtC;IACA,IAAID,KAAK,CAACE,SAAS,EAAE;MACjB;IACJ;IAEA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACC,aAAa,CAACJ,KAAK,CAACK,OAAO,EAAEN,KAAK,CAACO,OAAO,CAAC;IACxE,KAAK,MAAMC,MAAM,IAAIJ,SAAS,EAAE;MAC5B,MAAMK,SAAS,GAAG,MAAM,IAAI,CAACZ,0BAA0B,CAACa,OAAO,CAACF,MAAM,CAACG,EAAE,CAAC;MAC1E,IAAIF,SAAS,CAACG,MAAM,CAAC,CAAC,EAAE;QACpB;QACA;MAAA;IAER;EACJ;EAEA,MAAcP,aAAaA,CAACC,OAAe,EAAEC,OAAe,EAAE;IAC1D,MAAMM,aAAa,GAAG,MAAM,IAAI,CAACjB,oBAAoB,CAACc,OAAO,CAAC;MAC1DI,KAAK,EAAE,KAAK;MACZC,KAAK,EAAE;QACHC,SAAS,EAAE,aAAaV,OAAO,EAAE;QACjCW,mBAAmB,EAAE,GAAGV,OAAO;MACnC;IACJ,CAAC,CAAC;IAEF,OAAOM,aAAa,CAACK,KAAK,CAACC,KAAK;EACpC;AACJ;AAEA,OAAO,MAAMC,8CAA8C,GACvD7B,4BAA4B,CAAC8B,oBAAoB,CAAC;EAC9CC,cAAc,EAAE5B,6CAA6C;EAC7D6B,YAAY,EAAE,CAAC/B,2BAA2B,EAAEC,4BAA4B;AAC5E,CAAC,CAAC","ignoreList":[]}
|
package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.d.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EntryAfterPublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
/**
|
|
4
|
+
* Cancels scheduled "publish" when an entry is manually published
|
|
5
|
+
*
|
|
6
|
+
* When a user manually publishes an entry, any scheduled publish
|
|
7
|
+
* action for that entry should be canceled since the manual action
|
|
8
|
+
* takes precedence.
|
|
9
|
+
*/
|
|
10
|
+
declare class CancelScheduledActionOnPublishEventHandlerImpl implements EntryAfterPublishEventHandler.Interface {
|
|
11
|
+
private listScheduledActions;
|
|
12
|
+
private cancelScheduledEntryAction;
|
|
13
|
+
constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledEntryAction: CancelScheduledActionUseCase.Interface);
|
|
14
|
+
handle(event: EntryAfterPublishEventHandler.Event): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare const CancelScheduledActionOnPublishEventHandler: typeof CancelScheduledActionOnPublishEventHandlerImpl & {
|
|
17
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/PublishEntry/events").EntryAfterPublishEvent>>;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnPublishEventHandler.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EntryAfterPublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/PublishEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
|
|
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
|
+
class CancelScheduledActionOnPublishEventHandlerImpl {
|
|
12
|
+
constructor(listScheduledActions, cancelScheduledEntryAction) {
|
|
13
|
+
this.listScheduledActions = listScheduledActions;
|
|
14
|
+
this.cancelScheduledEntryAction = cancelScheduledEntryAction;
|
|
15
|
+
}
|
|
16
|
+
async handle(event) {
|
|
17
|
+
const {
|
|
18
|
+
entry,
|
|
19
|
+
model
|
|
20
|
+
} = event.payload;
|
|
21
|
+
|
|
22
|
+
// Skip private models
|
|
23
|
+
if (model.isPrivate) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const actionsResult = await this.listScheduledActions.execute({
|
|
27
|
+
where: {
|
|
28
|
+
namespace: `Cms/Entry/${model.modelId}`,
|
|
29
|
+
actionType: "Publish",
|
|
30
|
+
targetId: entry.id
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const actions = actionsResult.value.items;
|
|
34
|
+
for (const action of actions) {
|
|
35
|
+
const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);
|
|
36
|
+
if (cancelRes.isFail()) {
|
|
37
|
+
// Silently ignore errors - this is non-critical cleanup.
|
|
38
|
+
// Even if a schedule runs on an already published action, nothing bad will happen.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const CancelScheduledActionOnPublishEventHandler = EntryAfterPublishEventHandler.createImplementation({
|
|
44
|
+
implementation: CancelScheduledActionOnPublishEventHandlerImpl,
|
|
45
|
+
dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase]
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=CancelScheduledActionOnPublishEventHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryAfterPublishEventHandler","CancelScheduledActionUseCase","ListScheduledActionsUseCase","CancelScheduledActionOnPublishEventHandlerImpl","constructor","listScheduledActions","cancelScheduledEntryAction","handle","event","entry","model","payload","isPrivate","actionsResult","execute","where","namespace","modelId","actionType","targetId","id","actions","value","items","action","cancelRes","isFail","CancelScheduledActionOnPublishEventHandler","createImplementation","implementation","dependencies"],"sources":["CancelScheduledActionOnPublishEventHandler.ts"],"sourcesContent":["import { EntryAfterPublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/events\";\nimport { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from \"@webiny/api-scheduler\";\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 cancelScheduledEntryAction: CancelScheduledActionUseCase.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: `Cms/Entry/${model.modelId}`,\n actionType: \"Publish\",\n targetId: entry.id\n }\n });\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);\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]\n });\n"],"mappings":"AAAA,SAASA,6BAA6B,QAAQ,oEAAoE;AAClH,SAASC,4BAA4B,EAAEC,2BAA2B,QAAQ,uBAAuB;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,8CAA8C,CAEpD;EACIC,WAAWA,CACCC,oBAA2D,EAC3DC,0BAAkE,EAC5E;IAAA,KAFUD,oBAA2D,GAA3DA,oBAA2D;IAAA,KAC3DC,0BAAkE,GAAlEA,0BAAkE;EAC3E;EAEH,MAAMC,MAAMA,CAACC,KAA0C,EAAiB;IACpE,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGF,KAAK,CAACG,OAAO;;IAEtC;IACA,IAAID,KAAK,CAACE,SAAS,EAAE;MACjB;IACJ;IAEA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACR,oBAAoB,CAACS,OAAO,CAAC;MAC1DC,KAAK,EAAE;QACHC,SAAS,EAAE,aAAaN,KAAK,CAACO,OAAO,EAAE;QACvCC,UAAU,EAAE,SAAS;QACrBC,QAAQ,EAAEV,KAAK,CAACW;MACpB;IACJ,CAAC,CAAC;IAEF,MAAMC,OAAO,GAAGR,aAAa,CAACS,KAAK,CAACC,KAAK;IAEzC,KAAK,MAAMC,MAAM,IAAIH,OAAO,EAAE;MAC1B,MAAMI,SAAS,GAAG,MAAM,IAAI,CAACnB,0BAA0B,CAACQ,OAAO,CAACU,MAAM,CAACJ,EAAE,CAAC;MAC1E,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;QACpB;QACA;MAAA;IAER;EACJ;AACJ;AAEA,OAAO,MAAMC,0CAA0C,GACnD3B,6BAA6B,CAAC4B,oBAAoB,CAAC;EAC/CC,cAAc,EAAE1B,8CAA8C;EAC9D2B,YAAY,EAAE,CAAC5B,2BAA2B,EAAED,4BAA4B;AAC5E,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
/**
|
|
4
|
+
* Cancels scheduled actions when an entry revision is deleted
|
|
5
|
+
*
|
|
6
|
+
* When a user deletes an entry revision, any scheduled publish/unpublish
|
|
7
|
+
* action for that revision should be canceled since the revision
|
|
8
|
+
* no longer exists.
|
|
9
|
+
*/
|
|
10
|
+
declare class CancelScheduledActionOnDeleteHandlerImpl implements EntryAfterDeleteEventHandler.Interface {
|
|
11
|
+
private listScheduledActions;
|
|
12
|
+
private cancelScheduledEntryAction;
|
|
13
|
+
constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledEntryAction: CancelScheduledActionUseCase.Interface);
|
|
14
|
+
handle(event: EntryAfterDeleteEventHandler.Event): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare const CancelScheduledActionOnRevisionDeleteEventHandler: typeof CancelScheduledActionOnDeleteHandlerImpl & {
|
|
17
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events").EntryAfterDeleteEvent>>;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { EntryAfterDeleteEventHandler } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
|
|
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
|
+
class CancelScheduledActionOnDeleteHandlerImpl {
|
|
12
|
+
constructor(listScheduledActions, cancelScheduledEntryAction) {
|
|
13
|
+
this.listScheduledActions = listScheduledActions;
|
|
14
|
+
this.cancelScheduledEntryAction = cancelScheduledEntryAction;
|
|
15
|
+
}
|
|
16
|
+
async handle(event) {
|
|
17
|
+
const {
|
|
18
|
+
entry,
|
|
19
|
+
model
|
|
20
|
+
} = event.payload;
|
|
21
|
+
|
|
22
|
+
// Skip private models
|
|
23
|
+
if (model.isPrivate) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const actionsResult = await this.listScheduledActions.execute({
|
|
27
|
+
where: {
|
|
28
|
+
namespace: `Cms/Entry/${model.modelId}`,
|
|
29
|
+
targetId: entry.id
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
const actions = actionsResult.value.items;
|
|
33
|
+
for (const action of actions) {
|
|
34
|
+
const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);
|
|
35
|
+
if (cancelRes.isFail()) {
|
|
36
|
+
// Silently ignore errors - this is non-critical cleanup.
|
|
37
|
+
// Entry was deleted successfully, cancelling scheduled actions is best-effort.
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export const CancelScheduledActionOnRevisionDeleteEventHandler = EntryAfterDeleteEventHandler.createImplementation({
|
|
43
|
+
implementation: CancelScheduledActionOnDeleteHandlerImpl,
|
|
44
|
+
dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase]
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
//# sourceMappingURL=CancelScheduledActionOnRevisionDeleteEventHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryAfterDeleteEventHandler","CancelScheduledActionUseCase","ListScheduledActionsUseCase","CancelScheduledActionOnDeleteHandlerImpl","constructor","listScheduledActions","cancelScheduledEntryAction","handle","event","entry","model","payload","isPrivate","actionsResult","execute","where","namespace","modelId","targetId","id","actions","value","items","action","cancelRes","isFail","CancelScheduledActionOnRevisionDeleteEventHandler","createImplementation","implementation","dependencies"],"sources":["CancelScheduledActionOnRevisionDeleteEventHandler.ts"],"sourcesContent":["import { EntryAfterDeleteEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/events\";\nimport { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from \"@webiny/api-scheduler\";\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 cancelScheduledEntryAction: CancelScheduledActionUseCase.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: `Cms/Entry/${model.modelId}`,\n targetId: entry.id\n }\n });\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);\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]\n });\n"],"mappings":"AAAA,SAASA,4BAA4B,QAAQ,mEAAmE;AAChH,SAASC,4BAA4B,EAAEC,2BAA2B,QAAQ,uBAAuB;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,wCAAwC,CAAmD;EAC7FC,WAAWA,CACCC,oBAA2D,EAC3DC,0BAAkE,EAC5E;IAAA,KAFUD,oBAA2D,GAA3DA,oBAA2D;IAAA,KAC3DC,0BAAkE,GAAlEA,0BAAkE;EAC3E;EAEH,MAAMC,MAAMA,CAACC,KAAyC,EAAiB;IACnE,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGF,KAAK,CAACG,OAAO;;IAEtC;IACA,IAAID,KAAK,CAACE,SAAS,EAAE;MACjB;IACJ;IAEA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACR,oBAAoB,CAACS,OAAO,CAAC;MAC1DC,KAAK,EAAE;QACHC,SAAS,EAAE,aAAaN,KAAK,CAACO,OAAO,EAAE;QACvCC,QAAQ,EAAET,KAAK,CAACU;MACpB;IACJ,CAAC,CAAC;IAEF,MAAMC,OAAO,GAAGP,aAAa,CAACQ,KAAK,CAACC,KAAK;IAEzC,KAAK,MAAMC,MAAM,IAAIH,OAAO,EAAE;MAC1B,MAAMI,SAAS,GAAG,MAAM,IAAI,CAAClB,0BAA0B,CAACQ,OAAO,CAACS,MAAM,CAACJ,EAAE,CAAC;MAC1E,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;QACpB;QACA;MAAA;IAER;EACJ;AACJ;AAEA,OAAO,MAAMC,iDAAiD,GAC1D1B,4BAA4B,CAAC2B,oBAAoB,CAAC;EAC9CC,cAAc,EAAEzB,wCAAwC;EACxD0B,YAAY,EAAE,CAAC3B,2BAA2B,EAAED,4BAA4B;AAC5E,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { EntryAfterUnpublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
/**
|
|
4
|
+
* Cancels scheduled action when an entry is manually unpublished
|
|
5
|
+
*
|
|
6
|
+
* When a user manually unpublishes an entry revision, any scheduled unpublish
|
|
7
|
+
* action for that revision should be canceled since the manual action
|
|
8
|
+
* takes precedence.
|
|
9
|
+
*/
|
|
10
|
+
declare class CancelScheduledActionOnUnpublishHandlerImpl implements EntryAfterUnpublishEventHandler.Interface {
|
|
11
|
+
private listScheduledActions;
|
|
12
|
+
private cancelScheduledEntryAction;
|
|
13
|
+
constructor(listScheduledActions: ListScheduledActionsUseCase.Interface, cancelScheduledEntryAction: CancelScheduledActionUseCase.Interface);
|
|
14
|
+
handle(event: EntryAfterUnpublishEventHandler.Event): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare const CancelScheduledActionOnUnpublishEventHandler: typeof CancelScheduledActionOnUnpublishHandlerImpl & {
|
|
17
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events").EntryAfterUnpublishEvent>>;
|
|
18
|
+
};
|
|
19
|
+
export {};
|
package/features/CancelScheduledActionOnEntryChange/CancelScheduledActionOnUnpublishEventHandler.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { EntryAfterUnpublishEventHandler } from "@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events";
|
|
2
|
+
import { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from "@webiny/api-scheduler";
|
|
3
|
+
|
|
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
|
+
class CancelScheduledActionOnUnpublishHandlerImpl {
|
|
12
|
+
constructor(listScheduledActions, cancelScheduledEntryAction) {
|
|
13
|
+
this.listScheduledActions = listScheduledActions;
|
|
14
|
+
this.cancelScheduledEntryAction = cancelScheduledEntryAction;
|
|
15
|
+
}
|
|
16
|
+
async handle(event) {
|
|
17
|
+
const {
|
|
18
|
+
entry,
|
|
19
|
+
model
|
|
20
|
+
} = event.payload;
|
|
21
|
+
|
|
22
|
+
// Skip private models
|
|
23
|
+
if (model.isPrivate) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const actionsResult = await this.listScheduledActions.execute({
|
|
27
|
+
where: {
|
|
28
|
+
namespace: `Cms/Entry/${model.modelId}`,
|
|
29
|
+
actionType: "Unpublish",
|
|
30
|
+
targetId: entry.id
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const actions = actionsResult.value.items;
|
|
34
|
+
for (const action of actions) {
|
|
35
|
+
const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);
|
|
36
|
+
if (cancelRes.isFail()) {
|
|
37
|
+
// Silently ignore errors - this is non-critical cleanup.
|
|
38
|
+
// Entry was unpublished successfully, cancelling scheduled actions is best-effort.
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
export const CancelScheduledActionOnUnpublishEventHandler = EntryAfterUnpublishEventHandler.createImplementation({
|
|
44
|
+
implementation: CancelScheduledActionOnUnpublishHandlerImpl,
|
|
45
|
+
dependencies: [ListScheduledActionsUseCase, CancelScheduledActionUseCase]
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
//# sourceMappingURL=CancelScheduledActionOnUnpublishEventHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EntryAfterUnpublishEventHandler","CancelScheduledActionUseCase","ListScheduledActionsUseCase","CancelScheduledActionOnUnpublishHandlerImpl","constructor","listScheduledActions","cancelScheduledEntryAction","handle","event","entry","model","payload","isPrivate","actionsResult","execute","where","namespace","modelId","actionType","targetId","id","actions","value","items","action","cancelRes","isFail","CancelScheduledActionOnUnpublishEventHandler","createImplementation","implementation","dependencies"],"sources":["CancelScheduledActionOnUnpublishEventHandler.ts"],"sourcesContent":["import { EntryAfterUnpublishEventHandler } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/events\";\nimport { CancelScheduledActionUseCase, ListScheduledActionsUseCase } from \"@webiny/api-scheduler\";\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 cancelScheduledEntryAction: CancelScheduledActionUseCase.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: `Cms/Entry/${model.modelId}`,\n actionType: \"Unpublish\",\n targetId: entry.id\n }\n });\n\n const actions = actionsResult.value.items;\n\n for (const action of actions) {\n const cancelRes = await this.cancelScheduledEntryAction.execute(action.id);\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]\n });\n"],"mappings":"AAAA,SAASA,+BAA+B,QAAQ,sEAAsE;AACtH,SAASC,4BAA4B,EAAEC,2BAA2B,QAAQ,uBAAuB;;AAEjG;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,2CAA2C,CAEjD;EACIC,WAAWA,CACCC,oBAA2D,EAC3DC,0BAAkE,EAC5E;IAAA,KAFUD,oBAA2D,GAA3DA,oBAA2D;IAAA,KAC3DC,0BAAkE,GAAlEA,0BAAkE;EAC3E;EAEH,MAAMC,MAAMA,CAACC,KAA4C,EAAiB;IACtE,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAGF,KAAK,CAACG,OAAO;;IAEtC;IACA,IAAID,KAAK,CAACE,SAAS,EAAE;MACjB;IACJ;IAEA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACR,oBAAoB,CAACS,OAAO,CAAC;MAC1DC,KAAK,EAAE;QACHC,SAAS,EAAE,aAAaN,KAAK,CAACO,OAAO,EAAE;QACvCC,UAAU,EAAE,WAAW;QACvBC,QAAQ,EAAEV,KAAK,CAACW;MACpB;IACJ,CAAC,CAAC;IAEF,MAAMC,OAAO,GAAGR,aAAa,CAACS,KAAK,CAACC,KAAK;IAEzC,KAAK,MAAMC,MAAM,IAAIH,OAAO,EAAE;MAC1B,MAAMI,SAAS,GAAG,MAAM,IAAI,CAACnB,0BAA0B,CAACQ,OAAO,CAACU,MAAM,CAACJ,EAAE,CAAC;MAC1E,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;QACpB;QACA;MAAA;IAER;EACJ;AACJ;AAEA,OAAO,MAAMC,4CAA4C,GACrD3B,+BAA+B,CAAC4B,oBAAoB,CAAC;EACjDC,cAAc,EAAE1B,2CAA2C;EAC3D2B,YAAY,EAAE,CAAC5B,2BAA2B,EAAED,4BAA4B;AAC5E,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
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: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
|
|
@@ -0,0 +1,24 @@
|
|
|
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
|
+
|
|
7
|
+
/**
|
|
8
|
+
* CancelScheduledActionOnEntryChange Feature
|
|
9
|
+
*
|
|
10
|
+
* Automatically cancels scheduled actions when entries are manually
|
|
11
|
+
* published, unpublished, or deleted. This ensures scheduled actions
|
|
12
|
+
* don't execute after a user has already performed the action manually.
|
|
13
|
+
*/
|
|
14
|
+
export const CancelScheduledActionOnEntryChangeFeature = createFeature({
|
|
15
|
+
name: "CancelScheduledActionOnEntryChange",
|
|
16
|
+
register(container) {
|
|
17
|
+
container.register(CancelScheduledActionOnPublishEventHandler);
|
|
18
|
+
container.register(CancelScheduledActionOnUnpublishEventHandler);
|
|
19
|
+
container.register(CancelScheduledActionOnEntryDeleteEventHandler);
|
|
20
|
+
container.register(CancelScheduledActionOnRevisionDeleteEventHandler);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createFeature","CancelScheduledActionOnPublishEventHandler","CancelScheduledActionOnUnpublishEventHandler","CancelScheduledActionOnEntryDeleteEventHandler","CancelScheduledActionOnRevisionDeleteEventHandler","CancelScheduledActionOnEntryChangeFeature","name","register","container"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,0CAA0C;AACnD,SAASC,4CAA4C;AACrD,SAASC,8CAA8C;AACvD,SAASC,iDAAiD;;AAE1D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,yCAAyC,GAAGL,aAAa,CAAC;EACnEM,IAAI,EAAE,oCAAoC;EAC1CC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACN,0CAA0C,CAAC;IAC9DO,SAAS,CAACD,QAAQ,CAACL,4CAA4C,CAAC;IAChEM,SAAS,CAACD,QAAQ,CAACJ,8CAA8C,CAAC;IAClEK,SAAS,CAACD,QAAQ,CAACH,iDAAiD,CAAC;EACzE;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { CancelScheduledActionUseCase } from "@webiny/api-scheduler/features/CancelScheduledAction";
|
|
3
|
+
import { CancelScheduledEntryActionUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
4
|
+
/**
|
|
5
|
+
* Cancels a scheduled CMS entry action
|
|
6
|
+
*/
|
|
7
|
+
declare class CancelScheduledEntryActionUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
8
|
+
private cancelScheduledAction;
|
|
9
|
+
constructor(cancelScheduledAction: CancelScheduledActionUseCase.Interface);
|
|
10
|
+
execute(scheduleId: string): Promise<Result<void, UseCaseAbstraction.Error>>;
|
|
11
|
+
}
|
|
12
|
+
export declare const CancelScheduledEntryActionUseCase: typeof CancelScheduledEntryActionUseCaseImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICancelScheduledEntryActionUseCase>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { CancelScheduledActionUseCase } from "@webiny/api-scheduler/features/CancelScheduledAction";
|
|
3
|
+
import { CancelScheduledEntryActionUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Cancels a scheduled CMS entry action
|
|
7
|
+
*/
|
|
8
|
+
class CancelScheduledEntryActionUseCaseImpl {
|
|
9
|
+
constructor(cancelScheduledAction) {
|
|
10
|
+
this.cancelScheduledAction = cancelScheduledAction;
|
|
11
|
+
}
|
|
12
|
+
async execute(scheduleId) {
|
|
13
|
+
const cancelRes = await this.cancelScheduledAction.execute(scheduleId);
|
|
14
|
+
if (cancelRes.isFail()) {
|
|
15
|
+
return Result.fail(cancelRes.error);
|
|
16
|
+
}
|
|
17
|
+
return Result.ok();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export const CancelScheduledEntryActionUseCase = UseCaseAbstraction.createImplementation({
|
|
21
|
+
implementation: CancelScheduledEntryActionUseCaseImpl,
|
|
22
|
+
dependencies: [CancelScheduledActionUseCase]
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=CancelScheduledEntryActionUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Result","CancelScheduledActionUseCase","CancelScheduledEntryActionUseCase","UseCaseAbstraction","CancelScheduledEntryActionUseCaseImpl","constructor","cancelScheduledAction","execute","scheduleId","cancelRes","isFail","fail","error","ok","createImplementation","implementation","dependencies"],"sources":["CancelScheduledEntryActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CancelScheduledActionUseCase } from \"@webiny/api-scheduler/features/CancelScheduledAction\";\nimport { CancelScheduledEntryActionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\n\n/**\n * Cancels a scheduled CMS entry action\n */\nclass CancelScheduledEntryActionUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private cancelScheduledAction: CancelScheduledActionUseCase.Interface) {}\n\n async execute(scheduleId: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n const cancelRes = await this.cancelScheduledAction.execute(scheduleId);\n if (cancelRes.isFail()) {\n return Result.fail(cancelRes.error);\n }\n return Result.ok();\n }\n}\n\nexport const CancelScheduledEntryActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: CancelScheduledEntryActionUseCaseImpl,\n dependencies: [CancelScheduledActionUseCase]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,4BAA4B,QAAQ,sDAAsD;AACnG,SAASC,iCAAiC,IAAIC,kBAAkB;;AAEhE;AACA;AACA;AACA,MAAMC,qCAAqC,CAAyC;EAChFC,WAAWA,CAASC,qBAA6D,EAAE;IAAA,KAA/DA,qBAA6D,GAA7DA,qBAA6D;EAAG;EAEpF,MAAMC,OAAOA,CAACC,UAAkB,EAAmD;IAC/E,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACH,qBAAqB,CAACC,OAAO,CAACC,UAAU,CAAC;IACtE,IAAIC,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOV,MAAM,CAACW,IAAI,CAACF,SAAS,CAACG,KAAK,CAAC;IACvC;IACA,OAAOZ,MAAM,CAACa,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAMX,iCAAiC,GAAGC,kBAAkB,CAACW,oBAAoB,CAAC;EACrFC,cAAc,EAAEX,qCAAqC;EACrDY,YAAY,EAAE,CAACf,4BAA4B;AAC/C,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { ScheduledActionNotFoundError, ScheduledActionPersistenceError, SchedulerServiceError } from "@webiny/api-scheduler/domain/errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* CancelScheduledEntryActionUseCase - Cancel a scheduled CMS entry action
|
|
5
|
+
*
|
|
6
|
+
* This is a convenience use case for canceling scheduled CMS entry actions.
|
|
7
|
+
*/
|
|
8
|
+
export interface ICancelScheduledEntryActionErrors {
|
|
9
|
+
notFound: ScheduledActionNotFoundError;
|
|
10
|
+
persistence: ScheduledActionPersistenceError;
|
|
11
|
+
schedulerService: SchedulerServiceError;
|
|
12
|
+
}
|
|
13
|
+
type CancelScheduledEntryActionError = ICancelScheduledEntryActionErrors[keyof ICancelScheduledEntryActionErrors];
|
|
14
|
+
export interface ICancelScheduledEntryActionUseCase {
|
|
15
|
+
execute(scheduleId: string): Promise<Result<void, CancelScheduledEntryActionError>>;
|
|
16
|
+
}
|
|
17
|
+
export declare const CancelScheduledEntryActionUseCase: import("@webiny/di").Abstraction<ICancelScheduledEntryActionUseCase>;
|
|
18
|
+
export declare namespace CancelScheduledEntryActionUseCase {
|
|
19
|
+
type Interface = ICancelScheduledEntryActionUseCase;
|
|
20
|
+
type Error = CancelScheduledEntryActionError;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* CancelScheduledEntryActionUseCase - Cancel a scheduled CMS entry action
|
|
5
|
+
*
|
|
6
|
+
* This is a convenience use case for canceling scheduled CMS entry actions.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export const CancelScheduledEntryActionUseCase = createAbstraction("CancelScheduledEntryActionUseCase");
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=abstractions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createAbstraction","CancelScheduledEntryActionUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport {\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError,\n SchedulerServiceError\n} from \"@webiny/api-scheduler/domain/errors.js\";\n\n/**\n * CancelScheduledEntryActionUseCase - Cancel a scheduled CMS entry action\n *\n * This is a convenience use case for canceling scheduled CMS entry actions.\n */\n\nexport interface ICancelScheduledEntryActionErrors {\n notFound: ScheduledActionNotFoundError;\n persistence: ScheduledActionPersistenceError;\n schedulerService: SchedulerServiceError;\n}\n\ntype CancelScheduledEntryActionError =\n ICancelScheduledEntryActionErrors[keyof ICancelScheduledEntryActionErrors];\n\nexport interface ICancelScheduledEntryActionUseCase {\n execute(scheduleId: string): Promise<Result<void, CancelScheduledEntryActionError>>;\n}\n\nexport const CancelScheduledEntryActionUseCase =\n createAbstraction<ICancelScheduledEntryActionUseCase>(\"CancelScheduledEntryActionUseCase\");\n\nexport namespace CancelScheduledEntryActionUseCase {\n export type Interface = ICancelScheduledEntryActionUseCase;\n export type Error = CancelScheduledEntryActionError;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAQvD;AACA;AACA;AACA;AACA;;AAeA,OAAO,MAAMC,iCAAiC,GAC1CD,iBAAiB,CAAqC,mCAAmC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { CancelScheduledEntryActionUseCase } from "./CancelScheduledEntryActionUseCase.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* CancelScheduledEntryAction Feature
|
|
6
|
+
*
|
|
7
|
+
* Provides the ability to cancel scheduled CMS entry actions (publish/unpublish).
|
|
8
|
+
*/
|
|
9
|
+
export const CancelScheduledEntryActionFeature = createFeature({
|
|
10
|
+
name: "CancelScheduledEntryAction",
|
|
11
|
+
register(container) {
|
|
12
|
+
container.register(CancelScheduledEntryActionUseCase);
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
//# sourceMappingURL=feature.js.map
|