@webiny/api-headless-cms-bulk-actions 6.4.9-beta.0 → 6.4.10-beta.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/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js +1 -0
- package/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js.map +1 -1
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js +1 -0
- package/features/MoveToFolderBulkAction/MoveToFolderBulkAction.js.map +1 -1
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js +1 -0
- package/features/MoveToTrashBulkAction/MoveToTrashBulkAction.js.map +1 -1
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js +1 -0
- package/features/PublishEntriesBulkAction/PublishEntriesBulkAction.js.map +1 -1
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js +1 -0
- package/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js.map +1 -1
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js +1 -0
- package/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js.map +1 -1
- package/package.json +14 -14
- package/tasks/EmptyTrashBinTaskDefinition.js +6 -0
- package/tasks/EmptyTrashBinTaskDefinition.js.map +1 -1
|
@@ -10,6 +10,7 @@ class DeleteEntriesBulkActionImpl {
|
|
|
10
10
|
}
|
|
11
11
|
async loadData(model, params) {
|
|
12
12
|
const entriesResult = await this.listDeletedEntries.execute(model, params);
|
|
13
|
+
if (entriesResult.isFail()) throw entriesResult.error;
|
|
13
14
|
return entriesResult.value;
|
|
14
15
|
}
|
|
15
16
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js","sources":["../../../src/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass DeleteEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"delete\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.deleteEntry.execute(model, entryId, {\n permanently: true\n });\n }\n}\n\nexport const DeleteEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: DeleteEntriesBulkActionImpl,\n dependencies: [ListDeletedEntriesUseCase, DeleteEntryUseCase]\n});\n"],"names":["DeleteEntriesBulkActionImpl","listDeletedEntries","deleteEntry","model","params","entriesResult","entryId","parseIdentifier","DeleteEntriesBulkAction","EntriesBulkAction","ListDeletedEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,kBAAuD,EACvDC,WAAyC,CACnD;aAFUD,kBAAkB,GAAlBA;aACAC,WAAW,GAAXA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACF,OAAOC;
|
|
1
|
+
{"version":3,"file":"features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.js","sources":["../../../src/features/DeleteEntriesBulkAction/DeleteEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass DeleteEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"delete\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.deleteEntry.execute(model, entryId, {\n permanently: true\n });\n }\n}\n\nexport const DeleteEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: DeleteEntriesBulkActionImpl,\n dependencies: [ListDeletedEntriesUseCase, DeleteEntryUseCase]\n});\n"],"names":["DeleteEntriesBulkActionImpl","listDeletedEntries","deleteEntry","model","params","entriesResult","entryId","parseIdentifier","DeleteEntriesBulkAction","EntriesBulkAction","ListDeletedEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,kBAAuD,EACvDC,WAAyC,CACnD;aAFUD,kBAAkB,GAAlBA;aACAC,WAAW,GAAXA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACF,OAAOC;QACnE,IAAIC,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACD,OAAOG,SAAS;YAC3C,aAAa;QACjB;IACJ;AACJ;AAEO,MAAME,0BAA0BC,kBAAkB,oBAAoB,CAAC;IAC1E,gBAAgBT;IAChB,cAAc;QAACU;QAA2BC;KAAmB;AACjE"}
|
|
@@ -9,6 +9,7 @@ class MoveToFolderBulkActionImpl {
|
|
|
9
9
|
}
|
|
10
10
|
async loadData(model, params) {
|
|
11
11
|
const entriesResult = await this.listLatestEntries.execute(model, params);
|
|
12
|
+
if (entriesResult.isFail()) throw entriesResult.error;
|
|
12
13
|
return entriesResult.value;
|
|
13
14
|
}
|
|
14
15
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/MoveToFolderBulkAction/MoveToFolderBulkAction.js","sources":["../../../src/features/MoveToFolderBulkAction/MoveToFolderBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { MoveEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/MoveEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToFolderBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToFolder\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private moveEntry: MoveEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n if (!params.data?.folderId) {\n throw new Error(`Missing \"data.folderId\" in the input.`);\n }\n\n await this.moveEntry.execute(model, params.id, params.data.folderId);\n }\n}\n\nexport const MoveToFolderBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToFolderBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, MoveEntryUseCase]\n});\n"],"names":["MoveToFolderBulkActionImpl","listLatestEntries","moveEntry","model","params","entriesResult","Error","MoveToFolderBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","MoveEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,SAAqC,CAC/C;aAFUD,iBAAiB,GAAjBA;aACAC,SAAS,GAATA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;
|
|
1
|
+
{"version":3,"file":"features/MoveToFolderBulkAction/MoveToFolderBulkAction.js","sources":["../../../src/features/MoveToFolderBulkAction/MoveToFolderBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { MoveEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/MoveEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToFolderBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToFolder\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private moveEntry: MoveEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n if (!params.data?.folderId) {\n throw new Error(`Missing \"data.folderId\" in the input.`);\n }\n\n await this.moveEntry.execute(model, params.id, params.data.folderId);\n }\n}\n\nexport const MoveToFolderBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToFolderBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, MoveEntryUseCase]\n});\n"],"names":["MoveToFolderBulkActionImpl","listLatestEntries","moveEntry","model","params","entriesResult","Error","MoveToFolderBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","MoveEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,SAAqC,CAC/C;aAFUD,iBAAiB,GAAjBA;aACAC,SAAS,GAATA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;QAClE,IAAIC,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,IAAI,CAACA,OAAO,IAAI,EAAE,UACd,MAAM,IAAIE,MAAM;QAGpB,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACH,OAAOC,OAAO,EAAE,EAAEA,OAAO,IAAI,CAAC,QAAQ;IACvE;AACJ;AAEO,MAAMG,yBAAyBC,kBAAkB,oBAAoB,CAAC;IACzE,gBAAgBR;IAChB,cAAc;QAACS;QAA0BC;KAAiB;AAC9D"}
|
|
@@ -10,6 +10,7 @@ class MoveToTrashBulkActionImpl {
|
|
|
10
10
|
}
|
|
11
11
|
async loadData(model, params) {
|
|
12
12
|
const entriesResult = await this.listLatestEntries.execute(model, params);
|
|
13
|
+
if (entriesResult.isFail()) throw entriesResult.error;
|
|
13
14
|
return entriesResult.value;
|
|
14
15
|
}
|
|
15
16
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/MoveToTrashBulkAction/MoveToTrashBulkAction.js","sources":["../../../src/features/MoveToTrashBulkAction/MoveToTrashBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToTrashBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToTrash\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.deleteEntry.execute(model, entryId, {\n permanently: false\n });\n }\n}\n\nexport const MoveToTrashBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToTrashBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, DeleteEntryUseCase]\n});\n"],"names":["MoveToTrashBulkActionImpl","listLatestEntries","deleteEntry","model","params","entriesResult","entryId","parseIdentifier","MoveToTrashBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,WAAyC,CACnD;aAFUD,iBAAiB,GAAjBA;aACAC,WAAW,GAAXA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;
|
|
1
|
+
{"version":3,"file":"features/MoveToTrashBulkAction/MoveToTrashBulkAction.js","sources":["../../../src/features/MoveToTrashBulkAction/MoveToTrashBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass MoveToTrashBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"moveToTrash\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listLatestEntries.execute(model, params);\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.deleteEntry.execute(model, entryId, {\n permanently: false\n });\n }\n}\n\nexport const MoveToTrashBulkAction = EntriesBulkAction.createImplementation({\n implementation: MoveToTrashBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, DeleteEntryUseCase]\n});\n"],"names":["MoveToTrashBulkActionImpl","listLatestEntries","deleteEntry","model","params","entriesResult","entryId","parseIdentifier","MoveToTrashBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,WAAyC,CACnD;aAFUD,iBAAiB,GAAjBA;aACAC,WAAW,GAAXA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACF,OAAOC;QAClE,IAAIC,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACD,OAAOG,SAAS;YAC3C,aAAa;QACjB;IACJ;AACJ;AAEO,MAAME,wBAAwBC,kBAAkB,oBAAoB,CAAC;IACxE,gBAAgBT;IAChB,cAAc;QAACU;QAA0BC;KAAmB;AAChE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/PublishEntriesBulkAction/PublishEntriesBulkAction.js","sources":["../../../src/features/PublishEntriesBulkAction/PublishEntriesBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { PublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass PublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"publish\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private publishEntry: PublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const { where, ...rest } = params;\n\n const entriesResult = await this.listLatestEntries.execute(model, {\n ...rest,\n where: {\n ...where,\n status_not: \"published\"\n }\n });\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n await this.publishEntry.execute(model, params.id);\n }\n}\n\nexport const PublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: PublishEntriesBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, PublishEntryUseCase]\n});\n"],"names":["PublishEntriesBulkActionImpl","listLatestEntries","publishEntry","model","params","where","rest","entriesResult","PublishEntriesBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","PublishEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,YAA2C,CACrD;aAFUD,iBAAiB,GAAjBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAM,EAAEC,KAAK,EAAE,GAAGC,MAAM,GAAGF;QAE3B,MAAMG,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACJ,OAAO;YAC9D,GAAGG,IAAI;YACP,OAAO;gBACH,GAAGD,KAAK;gBACR,YAAY;YAChB;QACJ;QAEA,
|
|
1
|
+
{"version":3,"file":"features/PublishEntriesBulkAction/PublishEntriesBulkAction.js","sources":["../../../src/features/PublishEntriesBulkAction/PublishEntriesBulkAction.ts"],"sourcesContent":["import { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { PublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/PublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass PublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"publish\";\n\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private publishEntry: PublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const { where, ...rest } = params;\n\n const entriesResult = await this.listLatestEntries.execute(model, {\n ...rest,\n where: {\n ...where,\n status_not: \"published\"\n }\n });\n\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n await this.publishEntry.execute(model, params.id);\n }\n}\n\nexport const PublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: PublishEntriesBulkActionImpl,\n dependencies: [ListLatestEntriesUseCase, PublishEntryUseCase]\n});\n"],"names":["PublishEntriesBulkActionImpl","listLatestEntries","publishEntry","model","params","where","rest","entriesResult","PublishEntriesBulkAction","EntriesBulkAction","ListLatestEntriesUseCase","PublishEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,iBAAqD,EACrDC,YAA2C,CACrD;aAFUD,iBAAiB,GAAjBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAM,EAAEC,KAAK,EAAE,GAAGC,MAAM,GAAGF;QAE3B,MAAMG,gBAAgB,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACJ,OAAO;YAC9D,GAAGG,IAAI;YACP,OAAO;gBACH,GAAGD,KAAK;gBACR,YAAY;YAChB;QACJ;QAEA,IAAIE,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFJ,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,OAAOC,OAAO,EAAE;IACpD;AACJ;AAEO,MAAMI,2BAA2BC,kBAAkB,oBAAoB,CAAC;IAC3E,gBAAgBT;IAChB,cAAc;QAACU;QAA0BC;KAAoB;AACjE"}
|
|
@@ -10,6 +10,7 @@ class RestoreEntriesBulkActionImpl {
|
|
|
10
10
|
}
|
|
11
11
|
async loadData(model, params) {
|
|
12
12
|
const entriesResult = await this.listDeletedEntries.execute(model, params);
|
|
13
|
+
if (entriesResult.isFail()) throw entriesResult.error;
|
|
13
14
|
return entriesResult.value;
|
|
14
15
|
}
|
|
15
16
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js","sources":["../../../src/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { RestoreEntryFromBinUseCase } from \"@webiny/api-headless-cms/features/contentEntry/RestoreEntryFromBin/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass RestoreEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"restore\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private restoreEntry: RestoreEntryFromBinUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.restoreEntry.execute(model, entryId);\n }\n}\n\nexport const RestoreEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: RestoreEntriesBulkActionImpl,\n dependencies: [ListDeletedEntriesUseCase, RestoreEntryFromBinUseCase]\n});\n"],"names":["RestoreEntriesBulkActionImpl","listDeletedEntries","restoreEntry","model","params","entriesResult","entryId","parseIdentifier","RestoreEntriesBulkAction","EntriesBulkAction","ListDeletedEntriesUseCase","RestoreEntryFromBinUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,kBAAuD,EACvDC,YAAkD,CAC5D;aAFUD,kBAAkB,GAAlBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACF,OAAOC;
|
|
1
|
+
{"version":3,"file":"features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.js","sources":["../../../src/features/RestoreEntriesBulkAction/RestoreEntriesBulkAction.ts"],"sourcesContent":["import { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { RestoreEntryFromBinUseCase } from \"@webiny/api-headless-cms/features/contentEntry/RestoreEntryFromBin/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass RestoreEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"restore\";\n\n constructor(\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private restoreEntry: RestoreEntryFromBinUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listDeletedEntries.execute(model, params);\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n const { id: entryId } = parseIdentifier(params.id);\n\n await this.restoreEntry.execute(model, entryId);\n }\n}\n\nexport const RestoreEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: RestoreEntriesBulkActionImpl,\n dependencies: [ListDeletedEntriesUseCase, RestoreEntryFromBinUseCase]\n});\n"],"names":["RestoreEntriesBulkActionImpl","listDeletedEntries","restoreEntry","model","params","entriesResult","entryId","parseIdentifier","RestoreEntriesBulkAction","EntriesBulkAction","ListDeletedEntriesUseCase","RestoreEntryFromBinUseCase"],"mappings":";;;;AAKA,MAAMA;IAGF,YACYC,kBAAuD,EACvDC,YAAkD,CAC5D;aAFUD,kBAAkB,GAAlBA;aACAC,YAAY,GAAZA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACF,OAAOC;QACnE,IAAIC,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,EAAE,IAAIE,OAAO,EAAE,GAAGC,gBAAgBH,OAAO,EAAE;QAEjD,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,OAAOG;IAC3C;AACJ;AAEO,MAAME,2BAA2BC,kBAAkB,oBAAoB,CAAC;IAC3E,gBAAgBT;IAChB,cAAc;QAACU;QAA2BC;KAA2B;AACzE"}
|
|
@@ -9,6 +9,7 @@ class UnpublishEntriesBulkActionImpl {
|
|
|
9
9
|
}
|
|
10
10
|
async loadData(model, params) {
|
|
11
11
|
const entriesResult = await this.listPublishedEntries.execute(model, params);
|
|
12
|
+
if (entriesResult.isFail()) throw entriesResult.error;
|
|
12
13
|
return entriesResult.value;
|
|
13
14
|
}
|
|
14
15
|
async processData(model, params) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js","sources":["../../../src/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.ts"],"sourcesContent":["import { ListPublishedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass UnpublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"unpublish\";\n\n constructor(\n private listPublishedEntries: ListPublishedEntriesUseCase.Interface,\n private unpublishEntry: UnpublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listPublishedEntries.execute(model, params);\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n await this.unpublishEntry.execute(model, params.id);\n }\n}\n\nexport const UnpublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: UnpublishEntriesBulkActionImpl,\n dependencies: [ListPublishedEntriesUseCase, UnpublishEntryUseCase]\n});\n"],"names":["UnpublishEntriesBulkActionImpl","listPublishedEntries","unpublishEntry","model","params","entriesResult","UnpublishEntriesBulkAction","EntriesBulkAction","ListPublishedEntriesUseCase","UnpublishEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,cAA+C,CACzD;aAFUD,oBAAoB,GAApBA;aACAC,cAAc,GAAdA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAACF,OAAOC;
|
|
1
|
+
{"version":3,"file":"features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.js","sources":["../../../src/features/UnpublishEntriesBulkAction/UnpublishEntriesBulkAction.ts"],"sourcesContent":["import { ListPublishedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport { UnpublishEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UnpublishEntry/index.js\";\nimport { EntriesBulkAction } from \"~/features/EntriesBulkAction/abstractions.js\";\n\nclass UnpublishEntriesBulkActionImpl implements EntriesBulkAction.Interface {\n readonly name = \"unpublish\";\n\n constructor(\n private listPublishedEntries: ListPublishedEntriesUseCase.Interface,\n private unpublishEntry: UnpublishEntryUseCase.Interface\n ) {}\n\n async loadData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.LoadDataParams\n ): Promise<EntriesBulkAction.LoadDataResult> {\n const entriesResult = await this.listPublishedEntries.execute(model, params);\n if (entriesResult.isFail()) {\n throw entriesResult.error;\n }\n\n return entriesResult.value;\n }\n\n async processData(\n model: EntriesBulkAction.Model,\n params: EntriesBulkAction.ProcessParams\n ): Promise<void> {\n await this.unpublishEntry.execute(model, params.id);\n }\n}\n\nexport const UnpublishEntriesBulkAction = EntriesBulkAction.createImplementation({\n implementation: UnpublishEntriesBulkActionImpl,\n dependencies: [ListPublishedEntriesUseCase, UnpublishEntryUseCase]\n});\n"],"names":["UnpublishEntriesBulkActionImpl","listPublishedEntries","unpublishEntry","model","params","entriesResult","UnpublishEntriesBulkAction","EntriesBulkAction","ListPublishedEntriesUseCase","UnpublishEntryUseCase"],"mappings":";;;AAIA,MAAMA;IAGF,YACYC,oBAA2D,EAC3DC,cAA+C,CACzD;aAFUD,oBAAoB,GAApBA;aACAC,cAAc,GAAdA;aAJH,IAAI,GAAG;IAKb;IAEH,MAAM,SACFC,KAA8B,EAC9BC,MAAwC,EACC;QACzC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAACF,OAAOC;QACrE,IAAIC,cAAc,MAAM,IACpB,MAAMA,cAAc,KAAK;QAG7B,OAAOA,cAAc,KAAK;IAC9B;IAEA,MAAM,YACFF,KAA8B,EAC9BC,MAAuC,EAC1B;QACb,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACD,OAAOC,OAAO,EAAE;IACtD;AACJ;AAEO,MAAME,6BAA6BC,kBAAkB,oBAAoB,CAAC;IAC7E,gBAAgBP;IAChB,cAAc;QAACQ;QAA6BC;KAAsB;AACtE"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-headless-cms-bulk-actions",
|
|
3
|
-
"version": "6.4.
|
|
3
|
+
"version": "6.4.10-beta.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -17,21 +17,21 @@
|
|
|
17
17
|
},
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@webiny/api-headless-cms": "6.4.
|
|
21
|
-
"@webiny/background-tasks": "6.4.
|
|
22
|
-
"@webiny/feature": "6.4.
|
|
23
|
-
"@webiny/handler": "6.4.
|
|
24
|
-
"@webiny/handler-aws": "6.4.
|
|
25
|
-
"@webiny/utils": "6.4.
|
|
20
|
+
"@webiny/api-headless-cms": "6.4.10-beta.0",
|
|
21
|
+
"@webiny/background-tasks": "6.4.10-beta.0",
|
|
22
|
+
"@webiny/feature": "6.4.10-beta.0",
|
|
23
|
+
"@webiny/handler": "6.4.10-beta.0",
|
|
24
|
+
"@webiny/handler-aws": "6.4.10-beta.0",
|
|
25
|
+
"@webiny/utils": "6.4.10-beta.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@webiny/api": "6.4.
|
|
29
|
-
"@webiny/api-core": "6.4.
|
|
30
|
-
"@webiny/build-tools": "6.4.
|
|
31
|
-
"@webiny/handler-graphql": "6.4.
|
|
32
|
-
"@webiny/plugins": "6.4.
|
|
33
|
-
"@webiny/project-utils": "6.4.
|
|
34
|
-
"@webiny/wcp": "6.4.
|
|
28
|
+
"@webiny/api": "6.4.10-beta.0",
|
|
29
|
+
"@webiny/api-core": "6.4.10-beta.0",
|
|
30
|
+
"@webiny/build-tools": "6.4.10-beta.0",
|
|
31
|
+
"@webiny/handler-graphql": "6.4.10-beta.0",
|
|
32
|
+
"@webiny/plugins": "6.4.10-beta.0",
|
|
33
|
+
"@webiny/project-utils": "6.4.10-beta.0",
|
|
34
|
+
"@webiny/wcp": "6.4.10-beta.0",
|
|
35
35
|
"graphql": "16.14.2",
|
|
36
36
|
"typescript": "6.0.3",
|
|
37
37
|
"vitest": "4.1.10"
|
|
@@ -33,6 +33,7 @@ class EmptyTrashBinTask {
|
|
|
33
33
|
const { input, controller } = params;
|
|
34
34
|
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
35
35
|
const tenantsResult = await this.listTenants.execute();
|
|
36
|
+
if (tenantsResult.isFail()) return controller.response.error(tenantsResult.error);
|
|
36
37
|
const baseTenants = tenantsResult.value;
|
|
37
38
|
const executedTenantIds = input.executedTenantIds || [];
|
|
38
39
|
const tenants = baseTenants.filter((tenant)=>!executedTenantIds.includes(tenant.id));
|
|
@@ -49,6 +50,7 @@ class EmptyTrashBinTask {
|
|
|
49
50
|
const modelsResult = await this.listModels.execute({
|
|
50
51
|
includePrivate: false
|
|
51
52
|
});
|
|
53
|
+
if (modelsResult.isFail()) return void controller.logger.error(modelsResult.error);
|
|
52
54
|
const models = modelsResult.value;
|
|
53
55
|
for (const model of models){
|
|
54
56
|
const listEntriesParams = {
|
|
@@ -59,6 +61,10 @@ class EmptyTrashBinTask {
|
|
|
59
61
|
};
|
|
60
62
|
while(true){
|
|
61
63
|
const listResult = await this.listDeletedEntries.execute(model, listEntriesParams);
|
|
64
|
+
if (listResult.isFail()) {
|
|
65
|
+
controller.logger.error(listResult.error);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
62
68
|
const { entries, meta } = listResult.value;
|
|
63
69
|
if (0 === meta.totalCount) break;
|
|
64
70
|
if (controller.runtime.isCloseToTimeout()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks/EmptyTrashBinTaskDefinition.js","sources":["../../src/tasks/EmptyTrashBinTaskDefinition.ts"],"sourcesContent":["import type { IEmptyTrashBinsInput, IEmptyTrashBinsOutput } from \"~/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\n\nconst calculateDateTimeString = () => {\n // Retrieve the retention period from the environment variable WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS,\n // or default to 90 days if not set or set to 0.\n const retentionPeriodFromEnv = process.env[\"WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS\"];\n const retentionPeriod =\n retentionPeriodFromEnv && Number(retentionPeriodFromEnv) !== 0\n ? Number(retentionPeriodFromEnv)\n : 90;\n\n // Calculate the date-time by subtracting the retention period (in days) from the current date.\n const currentDate = new Date();\n currentDate.setDate(currentDate.getDate() - retentionPeriod);\n\n // Return the calculated date-time string in ISO 8601 format.\n return currentDate.toISOString();\n};\n\nclass EmptyTrashBinTask implements TaskDefinition.Interface<\n IEmptyTrashBinsInput,\n IEmptyTrashBinsOutput\n> {\n public readonly isPrivate = true;\n public readonly id = \"hcmsEntriesEmptyTrashBins\";\n public readonly title = \"Headless CMS - Empty all trash bins\";\n public readonly description =\n \"Delete all entries in the trash bin for each model in the system.\";\n public readonly maxIterations = 120;\n public readonly databaseLogs = false;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private tenantContext: TenantContext.Interface,\n private listTenants: ListTenantsUseCase.Interface,\n private listModels: ListModelsUseCase.Interface,\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async run(\n params: TaskDefinition.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>\n ): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>> {\n const { input, controller } = params;\n\n // Abort the task if needed.\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n // Fetch all tenants, excluding those already processed.\n const tenantsResult = await this.listTenants.execute();\n const baseTenants = tenantsResult.value;\n const executedTenantIds = input.executedTenantIds || [];\n const tenants = baseTenants.filter(tenant => !executedTenantIds.includes(tenant.id));\n\n let shouldTaskContinue = false;\n\n // Iterate over each tenant.\n await this.tenantContext.withEachTenant(tenants, async tenant => {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n // List all non-private models.\n const modelsResult = await this.listModels.execute({ includePrivate: false });\n const models = modelsResult.value;\n\n // Process each model to delete trashed entries.\n for (const model of models) {\n // Query parameters for fetching deleted entries older than a minute ago.\n const listEntriesParams = {\n where: {\n deletedOn_lt: calculateDateTimeString()\n },\n limit: 50\n };\n\n // Continue deleting entries while there are entries left to delete.\n while (true) {\n const listResult = await this.listDeletedEntries.execute(\n model,\n listEntriesParams\n );\n const { entries, meta } = listResult.value;\n\n if (meta.totalCount === 0) {\n break;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n for (const entry of entries) {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n // Delete each entry individually.\n await this.deleteEntry.execute(model, entry.id, { permanently: true });\n }\n }\n }\n\n // If the task isn't continuing, add the tenant to the executed list.\n if (!shouldTaskContinue) {\n executedTenantIds.push(tenant.id);\n }\n });\n\n // Continue the task or mark it as done based on the `shouldContinue` flag.\n return shouldTaskContinue\n ? controller.response.continue({ ...input, executedTenantIds })\n : controller.response.done(\n \"Task done: emptied the trash bin for all registered models.\"\n );\n }\n}\n\nexport const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({\n implementation: EmptyTrashBinTask,\n dependencies: [\n TenantContext,\n ListTenantsUseCase,\n ListModelsUseCase,\n ListDeletedEntriesUseCase,\n DeleteEntryUseCase\n ]\n});\n"],"names":["calculateDateTimeString","retentionPeriodFromEnv","process","retentionPeriod","Number","currentDate","Date","EmptyTrashBinTask","tenantContext","listTenants","listModels","listDeletedEntries","deleteEntry","params","input","controller","tenantsResult","baseTenants","executedTenantIds","tenants","tenant","shouldTaskContinue","modelsResult","models","model","listEntriesParams","listResult","entries","meta","entry","EmptyTrashBinTaskDefinition","TaskDefinition","TenantContext","ListTenantsUseCase","ListModelsUseCase","ListDeletedEntriesUseCase","DeleteEntryUseCase"],"mappings":";;;;;;AAQA,MAAMA,0BAA0B;IAG5B,MAAMC,yBAAyBC,QAAQ,GAAG,CAAC,yCAAyC;IACpF,MAAMC,kBACFF,0BAA0BG,AAAmC,MAAnCA,OAAOH,0BAC3BG,OAAOH,0BACP;IAGV,MAAMI,cAAc,IAAIC;IACxBD,YAAY,OAAO,CAACA,YAAY,OAAO,KAAKF;IAG5C,OAAOE,YAAY,WAAW;AAClC;AAEA,MAAME;IAcF,YACYC,aAAsC,EACtCC,WAAyC,EACzCC,UAAuC,EACvCC,kBAAuD,EACvDC,WAAyC,CACnD;aALUJ,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,UAAU,GAAVA;aACAC,kBAAkB,GAAlBA;aACAC,WAAW,GAAXA;aAfI,SAAS,GAAG;aACZ,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GACvB;aACY,aAAa,GAAG;aAChB,YAAY,GAAG;aAEf,WAAW,GAAG;YAAC;YAAsB;SAAmB;IAQrE;IAEH,MAAM,IACFC,MAA6E,EACF;QAC3E,MAAM,EAAEC,KAAK,EAAEC,UAAU,EAAE,GAAGF;QAG9B,IAAIE,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAItC,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QACpD,MAAMC,cAAcD,cAAc,KAAK;QACvC,MAAME,oBAAoBJ,MAAM,iBAAiB,IAAI,EAAE;QACvD,MAAMK,UAAUF,YAAY,MAAM,CAACG,CAAAA,SAAU,CAACF,kBAAkB,QAAQ,CAACE,OAAO,EAAE;QAElF,IAAIC,qBAAqB;QAGzB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAACF,SAAS,OAAMC;YACnD,IAAIL,WAAW,OAAO,CAAC,gBAAgB,IAAI;gBACvCM,qBAAqB;gBACrB;YACJ;YAEA,IAAIN,WAAW,OAAO,CAAC,gBAAgB,IAAI;gBACvCM,qBAAqB;gBACrB;YACJ;YAGA,MAAMC,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;gBAAE,gBAAgB;YAAM;YAC3E,MAAMC,SAASD,aAAa,KAAK;YAGjC,KAAK,MAAME,SAASD,OAAQ;gBAExB,MAAME,oBAAoB;oBACtB,OAAO;wBACH,cAAczB;oBAClB;oBACA,OAAO;gBACX;gBAGA,MAAO,KAAM;oBACT,MAAM0B,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CACpDF,OACAC;oBAEJ,MAAM,
|
|
1
|
+
{"version":3,"file":"tasks/EmptyTrashBinTaskDefinition.js","sources":["../../src/tasks/EmptyTrashBinTaskDefinition.ts"],"sourcesContent":["import type { IEmptyTrashBinsInput, IEmptyTrashBinsOutput } from \"~/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { ListTenantsUseCase } from \"@webiny/api-core/features/tenancy/ListTenants/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { ListDeletedEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\n\nconst calculateDateTimeString = () => {\n // Retrieve the retention period from the environment variable WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS,\n // or default to 90 days if not set or set to 0.\n const retentionPeriodFromEnv = process.env[\"WEBINY_TRASH_BIN_RETENTION_PERIOD_DAYS\"];\n const retentionPeriod =\n retentionPeriodFromEnv && Number(retentionPeriodFromEnv) !== 0\n ? Number(retentionPeriodFromEnv)\n : 90;\n\n // Calculate the date-time by subtracting the retention period (in days) from the current date.\n const currentDate = new Date();\n currentDate.setDate(currentDate.getDate() - retentionPeriod);\n\n // Return the calculated date-time string in ISO 8601 format.\n return currentDate.toISOString();\n};\n\nclass EmptyTrashBinTask implements TaskDefinition.Interface<\n IEmptyTrashBinsInput,\n IEmptyTrashBinsOutput\n> {\n public readonly isPrivate = true;\n public readonly id = \"hcmsEntriesEmptyTrashBins\";\n public readonly title = \"Headless CMS - Empty all trash bins\";\n public readonly description =\n \"Delete all entries in the trash bin for each model in the system.\";\n public readonly maxIterations = 120;\n public readonly databaseLogs = false;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private tenantContext: TenantContext.Interface,\n private listTenants: ListTenantsUseCase.Interface,\n private listModels: ListModelsUseCase.Interface,\n private listDeletedEntries: ListDeletedEntriesUseCase.Interface,\n private deleteEntry: DeleteEntryUseCase.Interface\n ) {}\n\n async run(\n params: TaskDefinition.RunParams<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>\n ): Promise<TaskDefinition.Result<IEmptyTrashBinsInput, IEmptyTrashBinsOutput>> {\n const { input, controller } = params;\n\n // Abort the task if needed.\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n // Fetch all tenants, excluding those already processed.\n const tenantsResult = await this.listTenants.execute();\n if (tenantsResult.isFail()) {\n return controller.response.error(tenantsResult.error);\n }\n const baseTenants = tenantsResult.value;\n const executedTenantIds = input.executedTenantIds || [];\n const tenants = baseTenants.filter(tenant => !executedTenantIds.includes(tenant.id));\n\n let shouldTaskContinue = false;\n\n // Iterate over each tenant.\n await this.tenantContext.withEachTenant(tenants, async tenant => {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n return;\n }\n\n // List all non-private models.\n const modelsResult = await this.listModels.execute({ includePrivate: false });\n if (modelsResult.isFail()) {\n controller.logger.error(modelsResult.error);\n return;\n }\n const models = modelsResult.value;\n\n // Process each model to delete trashed entries.\n for (const model of models) {\n // Query parameters for fetching deleted entries older than a minute ago.\n const listEntriesParams = {\n where: {\n deletedOn_lt: calculateDateTimeString()\n },\n limit: 50\n };\n\n // Continue deleting entries while there are entries left to delete.\n while (true) {\n const listResult = await this.listDeletedEntries.execute(\n model,\n listEntriesParams\n );\n if (listResult.isFail()) {\n controller.logger.error(listResult.error);\n break;\n }\n const { entries, meta } = listResult.value;\n\n if (meta.totalCount === 0) {\n break;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n for (const entry of entries) {\n if (controller.runtime.isCloseToTimeout()) {\n shouldTaskContinue = true;\n break;\n }\n // Delete each entry individually.\n await this.deleteEntry.execute(model, entry.id, { permanently: true });\n }\n }\n }\n\n // If the task isn't continuing, add the tenant to the executed list.\n if (!shouldTaskContinue) {\n executedTenantIds.push(tenant.id);\n }\n });\n\n // Continue the task or mark it as done based on the `shouldContinue` flag.\n return shouldTaskContinue\n ? controller.response.continue({ ...input, executedTenantIds })\n : controller.response.done(\n \"Task done: emptied the trash bin for all registered models.\"\n );\n }\n}\n\nexport const EmptyTrashBinTaskDefinition = TaskDefinition.createImplementation({\n implementation: EmptyTrashBinTask,\n dependencies: [\n TenantContext,\n ListTenantsUseCase,\n ListModelsUseCase,\n ListDeletedEntriesUseCase,\n DeleteEntryUseCase\n ]\n});\n"],"names":["calculateDateTimeString","retentionPeriodFromEnv","process","retentionPeriod","Number","currentDate","Date","EmptyTrashBinTask","tenantContext","listTenants","listModels","listDeletedEntries","deleteEntry","params","input","controller","tenantsResult","baseTenants","executedTenantIds","tenants","tenant","shouldTaskContinue","modelsResult","models","model","listEntriesParams","listResult","entries","meta","entry","EmptyTrashBinTaskDefinition","TaskDefinition","TenantContext","ListTenantsUseCase","ListModelsUseCase","ListDeletedEntriesUseCase","DeleteEntryUseCase"],"mappings":"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"}
|