@webiny/api-headless-cms 6.5.0-beta.2 → 6.5.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/exports/api/cms/entry.d.ts +2 -0
  2. package/exports/api/cms/entry.js +2 -0
  3. package/features/contentEntry/ContentEntriesFeature.js +4 -0
  4. package/features/contentEntry/ContentEntriesFeature.js.map +1 -1
  5. package/features/contentEntry/CreateEntry/CreateEntryUseCase.d.ts +2 -2
  6. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js +2 -2
  7. package/features/contentEntry/CreateEntry/CreateEntryUseCase.js.map +1 -1
  8. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.d.ts +2 -2
  9. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js +2 -2
  10. package/features/contentEntry/CreateEntryRevisionFrom/CreateEntryRevisionFromUseCase.js.map +1 -1
  11. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.d.ts +2 -2
  12. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js +2 -2
  13. package/features/contentEntry/DeleteEntry/DeleteEntryUseCase.js.map +1 -1
  14. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.d.ts +2 -2
  15. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js +2 -2
  16. package/features/contentEntry/DeleteEntry/MoveEntryToBinUseCase.js.map +1 -1
  17. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.d.ts +2 -2
  18. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js +2 -2
  19. package/features/contentEntry/DeleteEntryRevision/DeleteEntryRevisionUseCase.js.map +1 -1
  20. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.d.ts +2 -2
  21. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js +2 -2
  22. package/features/contentEntry/DeleteMultipleEntries/DeleteMultipleEntriesUseCase.js.map +1 -1
  23. package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.d.ts +17 -0
  24. package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.js +83 -0
  25. package/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.js.map +1 -0
  26. package/features/contentEntry/DuplicateEntry/abstractions.d.ts +47 -0
  27. package/features/contentEntry/DuplicateEntry/abstractions.js +5 -0
  28. package/features/contentEntry/DuplicateEntry/abstractions.js.map +1 -0
  29. package/features/contentEntry/DuplicateEntry/events.d.ts +41 -0
  30. package/features/contentEntry/DuplicateEntry/events.js +32 -0
  31. package/features/contentEntry/DuplicateEntry/events.js.map +1 -0
  32. package/features/contentEntry/DuplicateEntry/feature.d.ts +4 -0
  33. package/features/contentEntry/DuplicateEntry/feature.js +11 -0
  34. package/features/contentEntry/DuplicateEntry/feature.js.map +1 -0
  35. package/features/contentEntry/DuplicateEntry/index.d.ts +2 -0
  36. package/features/contentEntry/DuplicateEntry/index.js +2 -0
  37. package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.d.ts +7 -0
  38. package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.js +12 -0
  39. package/features/contentEntry/DuplicateEntry/prepareDuplicateValues.js.map +1 -0
  40. package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.d.ts +10 -0
  41. package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.js +25 -0
  42. package/features/contentEntry/EntryEventPublisher/EntryEventPublisher.js.map +1 -0
  43. package/features/contentEntry/EntryEventPublisher/abstractions.d.ts +16 -0
  44. package/features/contentEntry/EntryEventPublisher/abstractions.js +5 -0
  45. package/features/contentEntry/EntryEventPublisher/abstractions.js.map +1 -0
  46. package/features/contentEntry/EntryEventPublisher/feature.d.ts +4 -0
  47. package/features/contentEntry/EntryEventPublisher/feature.js +11 -0
  48. package/features/contentEntry/EntryEventPublisher/feature.js.map +1 -0
  49. package/features/contentEntry/EntryEventPublisher/index.d.ts +2 -0
  50. package/features/contentEntry/EntryEventPublisher/index.js +2 -0
  51. package/features/contentEntry/MoveEntry/MoveEntryUseCase.d.ts +2 -2
  52. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js +2 -2
  53. package/features/contentEntry/MoveEntry/MoveEntryUseCase.js.map +1 -1
  54. package/features/contentEntry/PublishEntry/PublishEntryUseCase.d.ts +2 -2
  55. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js +2 -2
  56. package/features/contentEntry/PublishEntry/PublishEntryUseCase.js.map +1 -1
  57. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.d.ts +2 -2
  58. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js +2 -2
  59. package/features/contentEntry/RepublishEntry/RepublishEntryUseCase.js.map +1 -1
  60. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.d.ts +2 -2
  61. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js +2 -2
  62. package/features/contentEntry/RestoreEntryFromBin/RestoreEntryFromBinUseCase.js.map +1 -1
  63. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.d.ts +2 -2
  64. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js +2 -2
  65. package/features/contentEntry/UnpublishEntry/UnpublishEntryUseCase.js.map +1 -1
  66. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.d.ts +2 -2
  67. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js +2 -2
  68. package/features/contentEntry/UpdateEntry/UpdateEntryUseCase.js.map +1 -1
  69. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.d.ts +2 -2
  70. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js +2 -2
  71. package/features/contentEntry/UpdateRevisionDescription/UpdateRevisionDescriptionUseCase.js.map +1 -1
  72. package/features/modelBuilder/abstractions.d.ts +4 -0
  73. package/features/modelBuilder/abstractions.js.map +1 -1
  74. package/features/modelBuilder/fields/DateTimeFieldType.js +1 -0
  75. package/features/modelBuilder/fields/DateTimeFieldType.js.map +1 -1
  76. package/features/modelBuilder/models/ModelBuilder.d.ts +8 -0
  77. package/features/modelBuilder/models/ModelBuilder.js +1 -0
  78. package/features/modelBuilder/models/ModelBuilder.js.map +1 -1
  79. package/features/modelBuilder/models/PrivateModelBuilder.d.ts +5 -0
  80. package/features/modelBuilder/models/PrivateModelBuilder.js +12 -1
  81. package/features/modelBuilder/models/PrivateModelBuilder.js.map +1 -1
  82. package/graphql/schema/createManageResolvers.js +3 -1
  83. package/graphql/schema/createManageResolvers.js.map +1 -1
  84. package/graphql/schema/createManageSDL.js +2 -0
  85. package/graphql/schema/createManageSDL.js.map +1 -1
  86. package/graphql/schema/resolvers/manage/resolveDuplicate.d.ts +7 -0
  87. package/graphql/schema/resolvers/manage/resolveDuplicate.js +11 -0
  88. package/graphql/schema/resolvers/manage/resolveDuplicate.js.map +1 -0
  89. package/package.json +18 -18
@@ -0,0 +1,83 @@
1
+ import { Result, createImplementation } from "@webiny/feature/api";
2
+ import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
3
+ import { DuplicateEntryUseCase } from "./abstractions.js";
4
+ import { AccessControl } from "../../shared/abstractions.js";
5
+ import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
6
+ import { CreateEntryUseCase } from "../CreateEntry/index.js";
7
+ import { STATUS_DRAFT } from "../entryDataFactories/statuses.js";
8
+ import { EntryNotAuthorizedError } from "../../../domain/contentEntry/errors.js";
9
+ import { EntryAfterDuplicateEvent, EntryBeforeDuplicateEvent, EntryDuplicateErrorEvent } from "./events.js";
10
+ import { prepareDuplicateValues } from "./prepareDuplicateValues.js";
11
+ class DuplicateEntryUseCaseImpl {
12
+ constructor(accessControl, getRevisionById, createEntry, eventPublisher){
13
+ this.accessControl = accessControl;
14
+ this.getRevisionById = getRevisionById;
15
+ this.createEntry = createEntry;
16
+ this.eventPublisher = eventPublisher;
17
+ }
18
+ async execute(model, sourceId) {
19
+ const canAccess = await this.accessControl.canAccessEntry({
20
+ model,
21
+ rwd: "w"
22
+ });
23
+ if (!canAccess) return Result.fail(EntryNotAuthorizedError.fromModel(model));
24
+ const originalResult = await this.getRevisionById.execute(model, sourceId);
25
+ if (originalResult.isFail()) return Result.fail(originalResult.error);
26
+ const original = originalResult.value;
27
+ const canAccessOriginal = await this.accessControl.canAccessEntry({
28
+ model,
29
+ entry: original
30
+ });
31
+ if (!canAccessOriginal) return Result.fail(EntryNotAuthorizedError.fromEntry(original));
32
+ try {
33
+ await this.eventPublisher.publish(new EntryBeforeDuplicateEvent({
34
+ model,
35
+ original
36
+ }));
37
+ const result = await this.createEntry.execute(model, {
38
+ values: prepareDuplicateValues(model, original.values),
39
+ location: {
40
+ folderId: original.location?.folderId
41
+ },
42
+ status: STATUS_DRAFT
43
+ }, {
44
+ skipValidation: true
45
+ });
46
+ if (result.isFail()) {
47
+ await this.eventPublisher.publish(new EntryDuplicateErrorEvent({
48
+ model,
49
+ original,
50
+ error: result.error
51
+ }));
52
+ return Result.fail(result.error);
53
+ }
54
+ const entry = result.value;
55
+ await this.eventPublisher.publish(new EntryAfterDuplicateEvent({
56
+ model,
57
+ original,
58
+ entry
59
+ }));
60
+ return Result.ok(entry);
61
+ } catch (error) {
62
+ await this.eventPublisher.publish(new EntryDuplicateErrorEvent({
63
+ model,
64
+ original,
65
+ error: error
66
+ }));
67
+ return Result.fail(error);
68
+ }
69
+ }
70
+ }
71
+ const DuplicateEntryUseCase_DuplicateEntryUseCase = createImplementation({
72
+ abstraction: DuplicateEntryUseCase,
73
+ implementation: DuplicateEntryUseCaseImpl,
74
+ dependencies: [
75
+ AccessControl,
76
+ GetRevisionByIdUseCase,
77
+ CreateEntryUseCase,
78
+ EntryEventPublisher
79
+ ]
80
+ });
81
+ export { DuplicateEntryUseCase_DuplicateEntryUseCase as DuplicateEntryUseCase };
82
+
83
+ //# sourceMappingURL=DuplicateEntryUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.js","sources":["../../../../src/features/contentEntry/DuplicateEntry/DuplicateEntryUseCase.ts"],"sourcesContent":["import { createImplementation, Result } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { DuplicateEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport { CreateEntryUseCase } from \"~/features/contentEntry/CreateEntry/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { STATUS_DRAFT } from \"~/features/contentEntry/entryDataFactories/statuses.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport {\n EntryAfterDuplicateEvent,\n EntryBeforeDuplicateEvent,\n EntryDuplicateErrorEvent\n} from \"./events.js\";\nimport { prepareDuplicateValues } from \"./prepareDuplicateValues.js\";\n\nclass DuplicateEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private createEntry: CreateEntryUseCase.Interface,\n private eventPublisher: EntryEventPublisher.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const originalResult = await this.getRevisionById.execute<T>(model, sourceId);\n if (originalResult.isFail()) {\n return Result.fail(originalResult.error);\n }\n\n const original = originalResult.value;\n\n /**\n * The duplicate is created by the current identity, so we must make sure the source entry\n * itself is accessible (e.g. \"own\" entries permission).\n */\n const canAccessOriginal = await this.accessControl.canAccessEntry({\n model,\n entry: original\n });\n if (!canAccessOriginal) {\n return Result.fail(EntryNotAuthorizedError.fromEntry(original));\n }\n\n try {\n await this.eventPublisher.publish(new EntryBeforeDuplicateEvent({ model, original }));\n\n const result = await this.createEntry.execute<T>(\n model,\n {\n values: prepareDuplicateValues<T>(model, original.values),\n location: {\n folderId: original.location?.folderId\n },\n status: STATUS_DRAFT\n },\n {\n // The duplicate is a draft, so validators (e.g. unique) are allowed to fail here.\n skipValidation: true\n }\n );\n\n if (result.isFail()) {\n await this.eventPublisher.publish(\n new EntryDuplicateErrorEvent({ model, original, error: result.error })\n );\n return Result.fail(result.error);\n }\n\n const entry = result.value;\n\n await this.eventPublisher.publish(\n new EntryAfterDuplicateEvent({ model, original, entry })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryDuplicateErrorEvent({ model, original, error: error as Error })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const DuplicateEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: DuplicateEntryUseCaseImpl,\n dependencies: [AccessControl, GetRevisionByIdUseCase, CreateEntryUseCase, EntryEventPublisher]\n});\n"],"names":["DuplicateEntryUseCaseImpl","accessControl","getRevisionById","createEntry","eventPublisher","model","sourceId","canAccess","Result","EntryNotAuthorizedError","originalResult","original","canAccessOriginal","EntryBeforeDuplicateEvent","result","prepareDuplicateValues","STATUS_DRAFT","EntryDuplicateErrorEvent","entry","EntryAfterDuplicateEvent","error","DuplicateEntryUseCase","createImplementation","UseCaseAbstraction","AccessControl","GetRevisionByIdUseCase","CreateEntryUseCase","EntryEventPublisher"],"mappings":";;;;;;;;;;AAgBA,MAAMA;IACF,YACYC,aAAsC,EACtCC,eAAiD,EACjDC,WAAyC,EACzCC,cAA6C,CACvD;aAJUH,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,QAAgB,EACsC;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,iBAAiB,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QACpE,IAAII,eAAe,MAAM,IACrB,OAAOF,OAAO,IAAI,CAACE,eAAe,KAAK;QAG3C,MAAMC,WAAWD,eAAe,KAAK;QAMrC,MAAME,oBAAoB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC9DP;YACA,OAAOM;QACX;QACA,IAAI,CAACC,mBACD,OAAOJ,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACE;QAGzD,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,0BAA0B;gBAAER;gBAAOM;YAAS;YAElF,MAAMG,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CACzCT,OACA;gBACI,QAAQU,uBAA0BV,OAAOM,SAAS,MAAM;gBACxD,UAAU;oBACN,UAAUA,SAAS,QAAQ,EAAE;gBACjC;gBACA,QAAQK;YACZ,GACA;gBAEI,gBAAgB;YACpB;YAGJ,IAAIF,OAAO,MAAM,IAAI;gBACjB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;oBAAEZ;oBAAOM;oBAAU,OAAOG,OAAO,KAAK;gBAAC;gBAExE,OAAON,OAAO,IAAI,CAACM,OAAO,KAAK;YACnC;YAEA,MAAMI,QAAQJ,OAAO,KAAK;YAE1B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIK,yBAAyB;gBAAEd;gBAAOM;gBAAUO;YAAM;YAG1D,OAAOV,OAAO,EAAE,CAACU;QACrB,EAAE,OAAOE,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,yBAAyB;gBAAEZ;gBAAOM;gBAAU,OAAOS;YAAe;YAE1E,OAAOZ,OAAO,IAAI,CAACY;QACvB;IACJ;AACJ;AAEO,MAAMC,8CAAwBC,qBAAqB;IACtD,aAAaC;IACb,gBAAgBvB;IAChB,cAAc;QAACwB;QAAeC;QAAwBC;QAAoBC;KAAoB;AAClG"}
@@ -0,0 +1,47 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import type { CmsEntry, CmsEntryValues, CmsModel } from "../../../types/index.js";
3
+ import type { EntryNotAuthorizedError, EntryNotFoundError, EntryPersistenceError, EntryValidationError } from "../../../domain/contentEntry/errors.js";
4
+ /**
5
+ * DuplicateEntry Use Case - Creates a new entry (version 1, draft) from an existing entry revision.
6
+ */
7
+ export interface IDuplicateEntryUseCase {
8
+ execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, sourceId: string): Promise<Result<CmsEntry<T>, UseCaseError>>;
9
+ }
10
+ export interface IDuplicateEntryUseCaseErrors {
11
+ notAuthorized: EntryNotAuthorizedError;
12
+ notFound: EntryNotFoundError;
13
+ validation: EntryValidationError;
14
+ storage: EntryPersistenceError;
15
+ }
16
+ type UseCaseError = IDuplicateEntryUseCaseErrors[keyof IDuplicateEntryUseCaseErrors];
17
+ /** Duplicate an existing entry revision into a new draft entry. */
18
+ export declare const DuplicateEntryUseCase: import("@webiny/di").Abstraction<IDuplicateEntryUseCase>;
19
+ export declare namespace DuplicateEntryUseCase {
20
+ type Interface = IDuplicateEntryUseCase;
21
+ type Error = UseCaseError;
22
+ type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<Result<CmsEntry<T>, UseCaseError>>;
23
+ }
24
+ /**
25
+ * Payload for before duplicate event
26
+ */
27
+ export interface EntryBeforeDuplicateEventPayload {
28
+ model: CmsModel;
29
+ original: CmsEntry;
30
+ }
31
+ /**
32
+ * Payload for after duplicate event
33
+ */
34
+ export interface EntryAfterDuplicateEventPayload {
35
+ model: CmsModel;
36
+ original: CmsEntry;
37
+ entry: CmsEntry;
38
+ }
39
+ /**
40
+ * Payload for duplicate error event
41
+ */
42
+ export interface EntryDuplicateErrorEventPayload {
43
+ model: CmsModel;
44
+ original: CmsEntry;
45
+ error: Error;
46
+ }
47
+ export {};
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const DuplicateEntryUseCase = createAbstraction("DuplicateEntryUseCase");
3
+ export { DuplicateEntryUseCase };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/DuplicateEntry/abstractions.js","sources":["../../../../src/features/contentEntry/DuplicateEntry/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport type {\n EntryNotAuthorizedError,\n EntryNotFoundError,\n EntryPersistenceError,\n EntryValidationError\n} from \"~/domain/contentEntry/errors.js\";\n\n/**\n * DuplicateEntry Use Case - Creates a new entry (version 1, draft) from an existing entry revision.\n */\nexport interface IDuplicateEntryUseCase {\n execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n sourceId: string\n ): Promise<Result<CmsEntry<T>, UseCaseError>>;\n}\n\nexport interface IDuplicateEntryUseCaseErrors {\n notAuthorized: EntryNotAuthorizedError;\n notFound: EntryNotFoundError;\n validation: EntryValidationError;\n storage: EntryPersistenceError;\n}\n\ntype UseCaseError = IDuplicateEntryUseCaseErrors[keyof IDuplicateEntryUseCaseErrors];\n\n/** Duplicate an existing entry revision into a new draft entry. */\nexport const DuplicateEntryUseCase =\n createAbstraction<IDuplicateEntryUseCase>(\"DuplicateEntryUseCase\");\n\nexport namespace DuplicateEntryUseCase {\n export type Interface = IDuplicateEntryUseCase;\n export type Error = UseCaseError;\n export type Return<T extends CmsEntryValues = CmsEntryValues> = Promise<\n Result<CmsEntry<T>, UseCaseError>\n >;\n}\n\n/**\n * Payload for before duplicate event\n */\nexport interface EntryBeforeDuplicateEventPayload {\n model: CmsModel;\n original: CmsEntry;\n}\n\n/**\n * Payload for after duplicate event\n */\nexport interface EntryAfterDuplicateEventPayload {\n model: CmsModel;\n original: CmsEntry;\n entry: CmsEntry;\n}\n\n/**\n * Payload for duplicate error event\n */\nexport interface EntryDuplicateErrorEventPayload {\n model: CmsModel;\n original: CmsEntry;\n error: Error;\n}\n"],"names":["DuplicateEntryUseCase","createAbstraction"],"mappings":";AA6BO,MAAMA,wBACTC,kBAA0C"}
@@ -0,0 +1,41 @@
1
+ import type { IEventHandler } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
+ import type { EntryAfterDuplicateEventPayload, EntryBeforeDuplicateEventPayload, EntryDuplicateErrorEventPayload } from "./abstractions.js";
4
+ /**
5
+ * Before duplicate entry event
6
+ */
7
+ export declare class EntryBeforeDuplicateEvent extends DomainEvent<EntryBeforeDuplicateEventPayload> {
8
+ eventType: "Cms/Entry/BeforeDuplicate";
9
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<EntryBeforeDuplicateEvent>>;
10
+ }
11
+ /** Hook into entry lifecycle before an entry is duplicated. */
12
+ export declare const EntryBeforeDuplicateEventHandler: import("@webiny/di").Abstraction<IEventHandler<EntryBeforeDuplicateEvent>>;
13
+ export declare namespace EntryBeforeDuplicateEventHandler {
14
+ type Interface = IEventHandler<EntryBeforeDuplicateEvent>;
15
+ type Event = EntryBeforeDuplicateEvent;
16
+ }
17
+ /**
18
+ * After duplicate entry event
19
+ */
20
+ export declare class EntryAfterDuplicateEvent extends DomainEvent<EntryAfterDuplicateEventPayload> {
21
+ eventType: "Cms/Entry/AfterDuplicate";
22
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<EntryAfterDuplicateEvent>>;
23
+ }
24
+ /** Hook into entry lifecycle after an entry is duplicated. */
25
+ export declare const EntryAfterDuplicateEventHandler: import("@webiny/di").Abstraction<IEventHandler<EntryAfterDuplicateEvent>>;
26
+ export declare namespace EntryAfterDuplicateEventHandler {
27
+ type Interface = IEventHandler<EntryAfterDuplicateEvent>;
28
+ type Event = EntryAfterDuplicateEvent;
29
+ }
30
+ /**
31
+ * Duplicate entry error event
32
+ */
33
+ export declare class EntryDuplicateErrorEvent extends DomainEvent<EntryDuplicateErrorEventPayload> {
34
+ eventType: "Cms/Entry/DuplicateError";
35
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<IEventHandler<EntryDuplicateErrorEvent>>;
36
+ }
37
+ export declare const EntryDuplicateErrorEventHandler: import("@webiny/di").Abstraction<IEventHandler<EntryDuplicateErrorEvent>>;
38
+ export declare namespace EntryDuplicateErrorEventHandler {
39
+ type Interface = IEventHandler<EntryDuplicateErrorEvent>;
40
+ type Event = EntryDuplicateErrorEvent;
41
+ }
@@ -0,0 +1,32 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
3
+ class EntryBeforeDuplicateEvent extends DomainEvent {
4
+ getHandlerAbstraction() {
5
+ return EntryBeforeDuplicateEventHandler;
6
+ }
7
+ constructor(...args){
8
+ super(...args), this.eventType = "Cms/Entry/BeforeDuplicate";
9
+ }
10
+ }
11
+ const EntryBeforeDuplicateEventHandler = createAbstraction("EntryBeforeDuplicateEventHandler");
12
+ class EntryAfterDuplicateEvent extends DomainEvent {
13
+ getHandlerAbstraction() {
14
+ return EntryAfterDuplicateEventHandler;
15
+ }
16
+ constructor(...args){
17
+ super(...args), this.eventType = "Cms/Entry/AfterDuplicate";
18
+ }
19
+ }
20
+ const EntryAfterDuplicateEventHandler = createAbstraction("EntryAfterDuplicateEventHandler");
21
+ class EntryDuplicateErrorEvent extends DomainEvent {
22
+ getHandlerAbstraction() {
23
+ return EntryDuplicateErrorEventHandler;
24
+ }
25
+ constructor(...args){
26
+ super(...args), this.eventType = "Cms/Entry/DuplicateError";
27
+ }
28
+ }
29
+ const EntryDuplicateErrorEventHandler = createAbstraction("EntryDuplicateErrorEventHandler");
30
+ export { EntryAfterDuplicateEvent, EntryAfterDuplicateEventHandler, EntryBeforeDuplicateEvent, EntryBeforeDuplicateEventHandler, EntryDuplicateErrorEvent, EntryDuplicateErrorEventHandler };
31
+
32
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/DuplicateEntry/events.js","sources":["../../../../src/features/contentEntry/DuplicateEntry/events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type {\n EntryAfterDuplicateEventPayload,\n EntryBeforeDuplicateEventPayload,\n EntryDuplicateErrorEventPayload\n} from \"./abstractions.js\";\n\n/**\n * Before duplicate entry event\n */\nexport class EntryBeforeDuplicateEvent extends DomainEvent<EntryBeforeDuplicateEventPayload> {\n eventType = \"Cms/Entry/BeforeDuplicate\" as const;\n\n getHandlerAbstraction() {\n return EntryBeforeDuplicateEventHandler;\n }\n}\n\n/** Hook into entry lifecycle before an entry is duplicated. */\nexport const EntryBeforeDuplicateEventHandler = createAbstraction<\n IEventHandler<EntryBeforeDuplicateEvent>\n>(\"EntryBeforeDuplicateEventHandler\");\n\nexport namespace EntryBeforeDuplicateEventHandler {\n export type Interface = IEventHandler<EntryBeforeDuplicateEvent>;\n export type Event = EntryBeforeDuplicateEvent;\n}\n\n/**\n * After duplicate entry event\n */\nexport class EntryAfterDuplicateEvent extends DomainEvent<EntryAfterDuplicateEventPayload> {\n eventType = \"Cms/Entry/AfterDuplicate\" as const;\n\n getHandlerAbstraction() {\n return EntryAfterDuplicateEventHandler;\n }\n}\n\n/** Hook into entry lifecycle after an entry is duplicated. */\nexport const EntryAfterDuplicateEventHandler = createAbstraction<\n IEventHandler<EntryAfterDuplicateEvent>\n>(\"EntryAfterDuplicateEventHandler\");\n\nexport namespace EntryAfterDuplicateEventHandler {\n export type Interface = IEventHandler<EntryAfterDuplicateEvent>;\n export type Event = EntryAfterDuplicateEvent;\n}\n\n/**\n * Duplicate entry error event\n */\nexport class EntryDuplicateErrorEvent extends DomainEvent<EntryDuplicateErrorEventPayload> {\n eventType = \"Cms/Entry/DuplicateError\" as const;\n\n getHandlerAbstraction() {\n return EntryDuplicateErrorEventHandler;\n }\n}\n\nexport const EntryDuplicateErrorEventHandler = createAbstraction<\n IEventHandler<EntryDuplicateErrorEvent>\n>(\"EntryDuplicateErrorEventHandler\");\n\nexport namespace EntryDuplicateErrorEventHandler {\n export type Interface = IEventHandler<EntryDuplicateErrorEvent>;\n export type Event = EntryDuplicateErrorEvent;\n}\n"],"names":["EntryBeforeDuplicateEvent","DomainEvent","EntryBeforeDuplicateEventHandler","createAbstraction","EntryAfterDuplicateEvent","EntryAfterDuplicateEventHandler","EntryDuplicateErrorEvent","EntryDuplicateErrorEventHandler"],"mappings":";;AAYO,MAAMA,kCAAkCC;IAG3C,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAGO,MAAMA,mCAAmCC,kBAE9C;AAUK,MAAMC,iCAAiCH;IAG1C,wBAAwB;QACpB,OAAOI;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAGO,MAAMA,kCAAkCF,kBAE7C;AAUK,MAAMG,iCAAiCL;IAG1C,wBAAwB;QACpB,OAAOM;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAEO,MAAMA,kCAAkCJ,kBAE7C"}
@@ -0,0 +1,4 @@
1
+ export declare const DuplicateEntryFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { DuplicateEntryUseCase } from "./DuplicateEntryUseCase.js";
3
+ const DuplicateEntryFeature = createFeature({
4
+ name: "DuplicateEntry",
5
+ register (container) {
6
+ container.register(DuplicateEntryUseCase);
7
+ }
8
+ });
9
+ export { DuplicateEntryFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/DuplicateEntry/feature.js","sources":["../../../../src/features/contentEntry/DuplicateEntry/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { DuplicateEntryUseCase } from \"./DuplicateEntryUseCase.js\";\n\nexport const DuplicateEntryFeature = createFeature({\n name: \"DuplicateEntry\",\n register(container) {\n container.register(DuplicateEntryUseCase);\n }\n});\n"],"names":["DuplicateEntryFeature","createFeature","container","DuplicateEntryUseCase"],"mappings":";;AAGO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { DuplicateEntryUseCase } from "./abstractions.js";
2
+ export { EntryAfterDuplicateEventHandler, EntryBeforeDuplicateEventHandler } from "./events.js";
@@ -0,0 +1,2 @@
1
+ export { DuplicateEntryUseCase } from "./abstractions.js";
2
+ export { EntryAfterDuplicateEventHandler, EntryBeforeDuplicateEventHandler } from "./events.js";
@@ -0,0 +1,7 @@
1
+ import type { CmsEntryValues, CmsModel } from "../../../types/index.js";
2
+ /**
3
+ * Prepares the complete values of the duplicated entry, so it can be stored with a single create operation.
4
+ * Values are deep-cloned once and only the title (when it is a text field) is changed. All other values,
5
+ * including unique fields, are copied as-is, since validation is skipped when creating the duplicate.
6
+ */
7
+ export declare const prepareDuplicateValues: <T extends CmsEntryValues = CmsEntryValues>(model: Pick<CmsModel, "titleFieldId" | "fields">, source: T) => T;
@@ -0,0 +1,12 @@
1
+ const TITLE_PREFIX = "Copy of ";
2
+ const prepareDuplicateValues = (model, source)=>{
3
+ const values = structuredClone(source);
4
+ const titleField = model.titleFieldId ? model.fields.find((field)=>field.fieldId === model.titleFieldId) : void 0;
5
+ if (!titleField || "text" !== titleField.type) return values;
6
+ const title = values[titleField.fieldId];
7
+ if ("string" == typeof title && title) values[titleField.fieldId] = `${TITLE_PREFIX}${title}`;
8
+ return values;
9
+ };
10
+ export { prepareDuplicateValues };
11
+
12
+ //# sourceMappingURL=prepareDuplicateValues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/DuplicateEntry/prepareDuplicateValues.js","sources":["../../../../src/features/contentEntry/DuplicateEntry/prepareDuplicateValues.ts"],"sourcesContent":["import type { CmsEntryValues, CmsModel } from \"~/types/index.js\";\n\nconst TITLE_PREFIX = \"Copy of \";\n\n/**\n * Prepares the complete values of the duplicated entry, so it can be stored with a single create operation.\n * Values are deep-cloned once and only the title (when it is a text field) is changed. All other values,\n * including unique fields, are copied as-is, since validation is skipped when creating the duplicate.\n */\nexport const prepareDuplicateValues = <T extends CmsEntryValues = CmsEntryValues>(\n model: Pick<CmsModel, \"titleFieldId\" | \"fields\">,\n source: T\n): T => {\n const values = structuredClone(source) as CmsEntryValues;\n\n const titleField = model.titleFieldId\n ? model.fields.find(field => field.fieldId === model.titleFieldId)\n : undefined;\n if (!titleField || titleField.type !== \"text\") {\n return values as T;\n }\n\n const title = values[titleField.fieldId];\n if (typeof title === \"string\" && title) {\n values[titleField.fieldId] = `${TITLE_PREFIX}${title}`;\n }\n\n return values as T;\n};\n"],"names":["TITLE_PREFIX","prepareDuplicateValues","model","source","values","structuredClone","titleField","field","undefined","title"],"mappings":"AAEA,MAAMA,eAAe;AAOd,MAAMC,yBAAyB,CAClCC,OACAC;IAEA,MAAMC,SAASC,gBAAgBF;IAE/B,MAAMG,aAAaJ,MAAM,YAAY,GAC/BA,MAAM,MAAM,CAAC,IAAI,CAACK,CAAAA,QAASA,MAAM,OAAO,KAAKL,MAAM,YAAY,IAC/DM;IACN,IAAI,CAACF,cAAcA,AAAoB,WAApBA,WAAW,IAAI,EAC9B,OAAOF;IAGX,MAAMK,QAAQL,MAAM,CAACE,WAAW,OAAO,CAAC;IACxC,IAAI,AAAiB,YAAjB,OAAOG,SAAsBA,OAC7BL,MAAM,CAACE,WAAW,OAAO,CAAC,GAAG,GAAGN,eAAeS,OAAO;IAG1D,OAAOL;AACX"}
@@ -0,0 +1,10 @@
1
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher as Abstraction, type EntryDomainEvent } from "./abstractions.js";
3
+ declare class EntryEventPublisherImpl implements Abstraction.Interface {
4
+ private eventPublisher;
5
+ constructor(eventPublisher: EventPublisher.Interface);
6
+ publish<TEvent extends EntryDomainEvent>(event: TEvent): Promise<void>;
7
+ private hasLifecycleEvents;
8
+ }
9
+ export declare const EntryEventPublisher: import("@webiny/di").Implementation<typeof EntryEventPublisherImpl>;
10
+ export {};
@@ -0,0 +1,25 @@
1
+ import { createImplementation } from "@webiny/feature/api";
2
+ import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
3
+ import { EntryEventPublisher } from "./abstractions.js";
4
+ class EntryEventPublisherImpl {
5
+ constructor(eventPublisher){
6
+ this.eventPublisher = eventPublisher;
7
+ }
8
+ async publish(event) {
9
+ if (!this.hasLifecycleEvents(event.payload.model)) return;
10
+ await this.eventPublisher.publish(event);
11
+ }
12
+ hasLifecycleEvents(model) {
13
+ return !(model.isPrivate && model.settings?.lifecycleEvents === false);
14
+ }
15
+ }
16
+ const EntryEventPublisher_EntryEventPublisher = createImplementation({
17
+ abstraction: EntryEventPublisher,
18
+ implementation: EntryEventPublisherImpl,
19
+ dependencies: [
20
+ EventPublisher
21
+ ]
22
+ });
23
+ export { EntryEventPublisher_EntryEventPublisher as EntryEventPublisher };
24
+
25
+ //# sourceMappingURL=EntryEventPublisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/EntryEventPublisher/EntryEventPublisher.js","sources":["../../../../src/features/contentEntry/EntryEventPublisher/EntryEventPublisher.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { EntryEventPublisher as Abstraction, type EntryDomainEvent } from \"./abstractions.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\nclass EntryEventPublisherImpl implements Abstraction.Interface {\n public constructor(private eventPublisher: EventPublisher.Interface) {}\n\n public async publish<TEvent extends EntryDomainEvent>(event: TEvent): Promise<void> {\n if (!this.hasLifecycleEvents(event.payload.model)) {\n return;\n }\n\n await this.eventPublisher.publish(event);\n }\n\n private hasLifecycleEvents(model: CmsModel): boolean {\n return !(model.isPrivate && model.settings?.lifecycleEvents === false);\n }\n}\n\nexport const EntryEventPublisher = createImplementation({\n abstraction: Abstraction,\n implementation: EntryEventPublisherImpl,\n dependencies: [EventPublisher]\n});\n"],"names":["EntryEventPublisherImpl","eventPublisher","event","model","EntryEventPublisher","createImplementation","Abstraction","EventPublisher"],"mappings":";;;AAKA,MAAMA;IACF,YAA2BC,cAAwC,CAAE;aAA1CA,cAAc,GAAdA;IAA2C;IAEtE,MAAa,QAAyCC,KAAa,EAAiB;QAChF,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAACA,MAAM,OAAO,CAAC,KAAK,GAC5C;QAGJ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACA;IACtC;IAEQ,mBAAmBC,KAAe,EAAW;QACjD,OAAO,CAAEA,CAAAA,MAAM,SAAS,IAAIA,MAAM,QAAQ,EAAE,oBAAoB,KAAI;IACxE;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgBN;IAChB,cAAc;QAACO;KAAe;AAClC"}
@@ -0,0 +1,16 @@
1
+ import type { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import type { CmsModel } from "../../../types/index.js";
3
+ export type EntryDomainEvent = DomainEvent<{
4
+ model: CmsModel;
5
+ }>;
6
+ /**
7
+ * Publishes entry lifecycle events (Cms/Entry/*).
8
+ * Events are not published for private models which have lifecycle events disabled.
9
+ */
10
+ export interface IEntryEventPublisher {
11
+ publish<TEvent extends EntryDomainEvent>(event: TEvent): Promise<void>;
12
+ }
13
+ export declare const EntryEventPublisher: import("@webiny/di").Abstraction<IEntryEventPublisher>;
14
+ export declare namespace EntryEventPublisher {
15
+ type Interface = IEntryEventPublisher;
16
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const EntryEventPublisher = createAbstraction("Cms/Entry/EntryEventPublisher");
3
+ export { EntryEventPublisher };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/EntryEventPublisher/abstractions.js","sources":["../../../../src/features/contentEntry/EntryEventPublisher/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { CmsModel } from \"~/types/index.js\";\n\nexport type EntryDomainEvent = DomainEvent<{ model: CmsModel }>;\n\n/**\n * Publishes entry lifecycle events (Cms/Entry/*).\n * Events are not published for private models which have lifecycle events disabled.\n */\nexport interface IEntryEventPublisher {\n publish<TEvent extends EntryDomainEvent>(event: TEvent): Promise<void>;\n}\n\nexport const EntryEventPublisher = createAbstraction<IEntryEventPublisher>(\n \"Cms/Entry/EntryEventPublisher\"\n);\n\nexport namespace EntryEventPublisher {\n export type Interface = IEntryEventPublisher;\n}\n"],"names":["EntryEventPublisher","createAbstraction"],"mappings":";AAcO,MAAMA,sBAAsBC,kBAC/B"}
@@ -0,0 +1,4 @@
1
+ export declare const EntryEventPublisherFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { EntryEventPublisher } from "./EntryEventPublisher.js";
3
+ const EntryEventPublisherFeature = createFeature({
4
+ name: "EntryEventPublisher",
5
+ register (container) {
6
+ container.register(EntryEventPublisher);
7
+ }
8
+ });
9
+ export { EntryEventPublisherFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/contentEntry/EntryEventPublisher/feature.js","sources":["../../../../src/features/contentEntry/EntryEventPublisher/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"./EntryEventPublisher.js\";\n\nexport const EntryEventPublisherFeature = createFeature({\n name: \"EntryEventPublisher\",\n register(container) {\n container.register(EntryEventPublisher);\n }\n});\n"],"names":["EntryEventPublisherFeature","createFeature","container","EntryEventPublisher"],"mappings":";;AAGO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1,2 @@
1
+ export { EntryEventPublisher } from "./abstractions.js";
2
+ export { EntryEventPublisherFeature } from "./feature.js";
@@ -0,0 +1,2 @@
1
+ export { EntryEventPublisher } from "./abstractions.js";
2
+ export { EntryEventPublisherFeature } from "./feature.js";
@@ -1,5 +1,5 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
3
3
  import { MoveEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { MoveEntryRepository } from "./abstractions.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
@@ -20,7 +20,7 @@ declare class MoveEntryUseCaseImpl implements UseCaseAbstraction.Interface {
20
20
  private accessControl;
21
21
  private getRevisionById;
22
22
  private eventPublisher;
23
- constructor(repository: MoveEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EventPublisher.Interface);
23
+ constructor(repository: MoveEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EntryEventPublisher.Interface);
24
24
  execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string, folderId: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
25
25
  }
26
26
  export declare const MoveEntryUseCase: import("@webiny/di").Implementation<typeof MoveEntryUseCaseImpl>;
@@ -1,5 +1,5 @@
1
1
  import { Result, createImplementation } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
3
3
  import { MoveEntryRepository, MoveEntryUseCase } from "./abstractions.js";
4
4
  import { AccessControl } from "../../shared/abstractions.js";
5
5
  import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
@@ -68,7 +68,7 @@ const MoveEntryUseCase_MoveEntryUseCase = createImplementation({
68
68
  MoveEntryRepository,
69
69
  AccessControl,
70
70
  GetRevisionByIdUseCase,
71
- EventPublisher
71
+ EntryEventPublisher
72
72
  ]
73
73
  });
74
74
  export { MoveEntryUseCase_MoveEntryUseCase as MoveEntryUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentEntry/MoveEntry/MoveEntryUseCase.js","sources":["../../../../src/features/contentEntry/MoveEntry/MoveEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { MoveEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { MoveEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { EntryBeforeMoveEvent, EntryAfterMoveEvent, EntryMoveErrorEvent } from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\n\n/**\n * MoveEntryUseCase - Orchestrates moving an entry to a different folder.\n *\n * Responsibilities:\n * - Apply access control\n * - Get the entry to move\n * - Check if entry is already in target folder (early return)\n * - Publish domain events\n * - Delegate to repository for storage operations\n */\nclass MoveEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: MoveEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n folderId: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n // Check access control\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Get the entry to move\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const entry = result.value;\n\n // Check access control on the specific entry\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Early return if entry is already in the requested folder\n if (entry.location?.folderId === folderId) {\n return Result.ok(entry);\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new EntryBeforeMoveEvent({\n entry,\n model,\n folderId\n })\n );\n\n // Delegate to repository\n const moveResult = await this.repository.execute(model, id, folderId);\n\n if (moveResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryMoveErrorEvent({\n entry,\n model,\n folderId,\n error: moveResult.error\n })\n );\n return Result.fail(moveResult.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new EntryAfterMoveEvent({\n entry,\n model,\n folderId\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryMoveErrorEvent({\n entry,\n model,\n folderId,\n error: error as Error\n })\n );\n return Result.fail(error as any);\n }\n }\n}\n\nexport const MoveEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: MoveEntryUseCaseImpl,\n dependencies: [MoveEntryRepository, AccessControl, GetRevisionByIdUseCase, EventPublisher]\n});\n"],"names":["MoveEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","model","id","folderId","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","entry","canAccessEntry","EntryBeforeMoveEvent","moveResult","EntryMoveErrorEvent","EntryAfterMoveEvent","error","MoveEntryUseCase","createImplementation","UseCaseAbstraction","MoveEntryRepository","AccessControl","GetRevisionByIdUseCase","EventPublisher"],"mappings":";;;;;;;AAsBA,MAAMA;IACF,YACYC,UAAyC,EACzCC,aAAsC,EACtCC,eAAiD,EACjDC,cAAwC,CAClD;aAJUH,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,QAAgB,EACsC;QAEtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEH;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACG,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAIzD,MAAMM,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIN,OAAOC;QAE5D,IAAIK,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBN;QAG9C,MAAMO,QAAQF,OAAO,KAAK;QAG1B,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DT;YACAQ;YACA,KAAK;QACT;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAIzD,IAAIQ,MAAM,QAAQ,EAAE,aAAaN,UAC7B,OAAOE,OAAO,EAAE,CAACI;QAGrB,IAAI;YAEA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,qBAAqB;gBACrBF;gBACAR;gBACAE;YACJ;YAIJ,MAAMS,aAAa,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACX,OAAOC,IAAIC;YAE5D,IAAIS,WAAW,MAAM,IAAI;gBACrB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,oBAAoB;oBACpBJ;oBACAR;oBACAE;oBACA,OAAOS,WAAW,KAAK;gBAC3B;gBAEJ,OAAOP,OAAO,IAAI,CAACO,WAAW,KAAK;YACvC;YAGA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,oBAAoB;gBACpBL;gBACAR;gBACAE;YACJ;YAGJ,OAAOE,OAAO,EAAE,CAACI;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIF,oBAAoB;gBACpBJ;gBACAR;gBACAE;gBACA,OAAOY;YACX;YAEJ,OAAOV,OAAO,IAAI,CAACU;QACvB;IACJ;AACJ;AAEO,MAAMC,oCAAmBC,qBAAqB;IACjD,aAAaC;IACb,gBAAgBtB;IAChB,cAAc;QAACuB;QAAqBC;QAAeC;QAAwBC;KAAe;AAC9F"}
1
+ {"version":3,"file":"features/contentEntry/MoveEntry/MoveEntryUseCase.js","sources":["../../../../src/features/contentEntry/MoveEntry/MoveEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { MoveEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { MoveEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport { EntryBeforeMoveEvent, EntryAfterMoveEvent, EntryMoveErrorEvent } from \"./events.js\";\nimport { EntryNotAuthorizedError } from \"~/domain/contentEntry/errors.js\";\nimport { EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\n\n/**\n * MoveEntryUseCase - Orchestrates moving an entry to a different folder.\n *\n * Responsibilities:\n * - Apply access control\n * - Get the entry to move\n * - Check if entry is already in target folder (early return)\n * - Publish domain events\n * - Delegate to repository for storage operations\n */\nclass MoveEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: MoveEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EntryEventPublisher.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string,\n folderId: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n // Check access control\n const canAccess = await this.accessControl.canAccessEntry({ model, rwd: \"w\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Get the entry to move\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const entry = result.value;\n\n // Check access control on the specific entry\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry,\n rwd: \"w\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n // Early return if entry is already in the requested folder\n if (entry.location?.folderId === folderId) {\n return Result.ok(entry);\n }\n\n try {\n // Publish before event\n await this.eventPublisher.publish(\n new EntryBeforeMoveEvent({\n entry,\n model,\n folderId\n })\n );\n\n // Delegate to repository\n const moveResult = await this.repository.execute(model, id, folderId);\n\n if (moveResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryMoveErrorEvent({\n entry,\n model,\n folderId,\n error: moveResult.error\n })\n );\n return Result.fail(moveResult.error);\n }\n\n // Publish after event\n await this.eventPublisher.publish(\n new EntryAfterMoveEvent({\n entry,\n model,\n folderId\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryMoveErrorEvent({\n entry,\n model,\n folderId,\n error: error as Error\n })\n );\n return Result.fail(error as any);\n }\n }\n}\n\nexport const MoveEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: MoveEntryUseCaseImpl,\n dependencies: [MoveEntryRepository, AccessControl, GetRevisionByIdUseCase, EntryEventPublisher]\n});\n"],"names":["MoveEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","model","id","folderId","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","entry","canAccessEntry","EntryBeforeMoveEvent","moveResult","EntryMoveErrorEvent","EntryAfterMoveEvent","error","MoveEntryUseCase","createImplementation","UseCaseAbstraction","MoveEntryRepository","AccessControl","GetRevisionByIdUseCase","EntryEventPublisher"],"mappings":";;;;;;;AAsBA,MAAMA;IACF,YACYC,UAAyC,EACzCC,aAAsC,EACtCC,eAAiD,EACjDC,cAA6C,CACvD;aAJUH,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EACVC,QAAgB,EACsC;QAEtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEH;YAAO,KAAK;QAAI;QAC5E,IAAI,CAACG,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAIzD,MAAMM,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIN,OAAOC;QAE5D,IAAIK,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBN;QAG9C,MAAMO,QAAQF,OAAO,KAAK;QAG1B,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DT;YACAQ;YACA,KAAK;QACT;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACL;QAIzD,IAAIQ,MAAM,QAAQ,EAAE,aAAaN,UAC7B,OAAOE,OAAO,EAAE,CAACI;QAGrB,IAAI;YAEA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,qBAAqB;gBACrBF;gBACAR;gBACAE;YACJ;YAIJ,MAAMS,aAAa,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACX,OAAOC,IAAIC;YAE5D,IAAIS,WAAW,MAAM,IAAI;gBACrB,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,oBAAoB;oBACpBJ;oBACAR;oBACAE;oBACA,OAAOS,WAAW,KAAK;gBAC3B;gBAEJ,OAAOP,OAAO,IAAI,CAACO,WAAW,KAAK;YACvC;YAGA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,oBAAoB;gBACpBL;gBACAR;gBACAE;YACJ;YAGJ,OAAOE,OAAO,EAAE,CAACI;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIF,oBAAoB;gBACpBJ;gBACAR;gBACAE;gBACA,OAAOY;YACX;YAEJ,OAAOV,OAAO,IAAI,CAACU;QACvB;IACJ;AACJ;AAEO,MAAMC,oCAAmBC,qBAAqB;IACjD,aAAaC;IACb,gBAAgBtB;IAChB,cAAc;QAACuB;QAAqBC;QAAeC;QAAwBC;KAAoB;AACnG"}
@@ -1,5 +1,5 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
3
3
  import { PublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { PublishEntryRepository } from "./abstractions.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
@@ -12,7 +12,7 @@ declare class PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {
12
12
  private getRevisionById;
13
13
  private eventPublisher;
14
14
  private createPublishEntryDataFactory;
15
- constructor(repository: PublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EventPublisher.Interface, createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface);
15
+ constructor(repository: PublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EntryEventPublisher.Interface, createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface);
16
16
  execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
17
17
  }
18
18
  export declare const PublishEntryUseCase: import("@webiny/di").Implementation<typeof PublishEntryUseCaseImpl>;
@@ -1,5 +1,5 @@
1
1
  import { Result, createImplementation } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
3
3
  import { PublishEntryRepository, PublishEntryUseCase } from "./abstractions.js";
4
4
  import { AccessControl } from "../../shared/abstractions.js";
5
5
  import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
@@ -73,7 +73,7 @@ const PublishEntryUseCase_PublishEntryUseCase = createImplementation({
73
73
  PublishEntryRepository,
74
74
  AccessControl,
75
75
  GetRevisionByIdUseCase,
76
- EventPublisher,
76
+ EntryEventPublisher,
77
77
  CreatePublishEntryDataFactory
78
78
  ]
79
79
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforePublishEvent,\n EntryAfterPublishEvent,\n EntryPublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError, EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreatePublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/index.js\";\n\nclass PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: PublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createPublishEntryDataFactory.create<T>(model, originalEntry);\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(\n new EntryBeforePublishEvent({\n entry,\n original: originalEntry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: repositoryResult.error\n })\n );\n return Result.fail(repositoryResult.error);\n }\n\n const publishedEntry = repositoryResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterPublishEvent({\n entry: publishedEntry,\n original: originalEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const PublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: PublishEntryUseCaseImpl,\n dependencies: [\n PublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EventPublisher,\n CreatePublishEntryDataFactory\n ]\n});\n"],"names":["PublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createPublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","dataResult","entry","EntryBeforePublishEvent","repositoryResult","EntryPublishErrorEvent","publishedEntry","EntryAfterPublishEvent","error","PublishEntryUseCase","createImplementation","UseCaseAbstraction","PublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EventPublisher","CreatePublishEntryDataFactory"],"mappings":";;;;;;;;AAgBA,MAAMA;IACF,YACYC,UAA4C,EAC5CC,aAAsC,EACtCC,eAAiD,EACjDC,cAAwC,EACxCC,6BAAsE,CAChF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,6BAA6B,GAA7BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QAE5D,IAAII,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,aAAa,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAIT,OAAOO;QAC7E,IAAIE,WAAW,MAAM,IACjB,OAAON,OAAO,IAAI,CAACM,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,wBAAwB;gBACxBD;gBACA,UAAUH;gBACVP;YACJ;YAGJ,MAAMY,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACZ,OAAOU;YAE9D,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,uBAAuB;oBACvBH;oBACA,UAAUH;oBACVP;oBACA,OAAOY,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOT,OAAO,IAAI,CAACS,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,uBAAuB;gBACvB,OAAOD;gBACP,UAAUP;gBACVP;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACO;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,uBAAuB;gBACvBH;gBACA,UAAUH;gBACVP;gBACA,OAAOgB;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"features/contentEntry/PublishEntry/PublishEntryUseCase.js","sources":["../../../../src/features/contentEntry/PublishEntry/PublishEntryUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { EntryEventPublisher } from \"~/features/contentEntry/EntryEventPublisher/index.js\";\nimport { PublishEntryUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { PublishEntryRepository } from \"./abstractions.js\";\nimport { AccessControl } from \"~/features/shared/abstractions.js\";\nimport { GetRevisionByIdUseCase } from \"~/features/contentEntry/GetRevisionById/index.js\";\nimport type { CmsEntry, CmsEntryValues, CmsModel } from \"~/types/index.js\";\nimport {\n EntryBeforePublishEvent,\n EntryAfterPublishEvent,\n EntryPublishErrorEvent\n} from \"./events.js\";\nimport { EntryNotAuthorizedError, EntryNotFoundError } from \"~/domain/contentEntry/errors.js\";\nimport { CreatePublishEntryDataFactory } from \"~/features/contentEntry/entryDataFactories/CreatePublishEntryDataFactory/index.js\";\n\nclass PublishEntryUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private repository: PublishEntryRepository.Interface,\n private accessControl: AccessControl.Interface,\n private getRevisionById: GetRevisionByIdUseCase.Interface,\n private eventPublisher: EntryEventPublisher.Interface,\n private createPublishEntryDataFactory: CreatePublishEntryDataFactory.Interface\n ) {}\n\n async execute<T extends CmsEntryValues = CmsEntryValues>(\n model: CmsModel,\n id: string\n ): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>> {\n const canAccess = await this.accessControl.canAccessEntry({ model, pw: \"p\" });\n if (!canAccess) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const result = await this.getRevisionById.execute<T>(model, id);\n\n if (result.isFail()) {\n return Result.fail(new EntryNotFoundError(id));\n }\n\n const originalEntry = result.value;\n\n const canAccessEntry = await this.accessControl.canAccessEntry({\n model,\n entry: originalEntry,\n pw: \"p\"\n });\n\n if (!canAccessEntry) {\n return Result.fail(EntryNotAuthorizedError.fromModel(model));\n }\n\n const dataResult = await this.createPublishEntryDataFactory.create<T>(model, originalEntry);\n if (dataResult.isFail()) {\n return Result.fail(dataResult.error);\n }\n const { entry } = dataResult.value;\n\n try {\n await this.eventPublisher.publish(\n new EntryBeforePublishEvent({\n entry,\n original: originalEntry,\n model\n })\n );\n\n const repositoryResult = await this.repository.execute(model, entry);\n\n if (repositoryResult.isFail()) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: repositoryResult.error\n })\n );\n return Result.fail(repositoryResult.error);\n }\n\n const publishedEntry = repositoryResult.value;\n\n await this.eventPublisher.publish(\n new EntryAfterPublishEvent({\n entry: publishedEntry,\n original: originalEntry,\n model\n })\n );\n\n return Result.ok(entry);\n } catch (error) {\n await this.eventPublisher.publish(\n new EntryPublishErrorEvent({\n entry,\n original: originalEntry,\n model,\n error: error as Error\n })\n );\n return Result.fail(error as UseCaseAbstraction.Error);\n }\n }\n}\n\nexport const PublishEntryUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: PublishEntryUseCaseImpl,\n dependencies: [\n PublishEntryRepository,\n AccessControl,\n GetRevisionByIdUseCase,\n EntryEventPublisher,\n CreatePublishEntryDataFactory\n ]\n});\n"],"names":["PublishEntryUseCaseImpl","repository","accessControl","getRevisionById","eventPublisher","createPublishEntryDataFactory","model","id","canAccess","Result","EntryNotAuthorizedError","result","EntryNotFoundError","originalEntry","canAccessEntry","dataResult","entry","EntryBeforePublishEvent","repositoryResult","EntryPublishErrorEvent","publishedEntry","EntryAfterPublishEvent","error","PublishEntryUseCase","createImplementation","UseCaseAbstraction","PublishEntryRepository","AccessControl","GetRevisionByIdUseCase","EntryEventPublisher","CreatePublishEntryDataFactory"],"mappings":";;;;;;;;AAgBA,MAAMA;IACF,YACYC,UAA4C,EAC5CC,aAAsC,EACtCC,eAAiD,EACjDC,cAA6C,EAC7CC,6BAAsE,CAChF;aALUJ,UAAU,GAAVA;aACAC,aAAa,GAAbA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aACAC,6BAA6B,GAA7BA;IACT;IAEH,MAAM,QACFC,KAAe,EACfC,EAAU,EAC4C;QACtD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAAEF;YAAO,IAAI;QAAI;QAC3E,IAAI,CAACE,WACD,OAAOC,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMK,SAAS,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAIL,OAAOC;QAE5D,IAAII,OAAO,MAAM,IACb,OAAOF,OAAO,IAAI,CAAC,IAAIG,mBAAmBL;QAG9C,MAAMM,gBAAgBF,OAAO,KAAK;QAElC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC;YAC3DR;YACA,OAAOO;YACP,IAAI;QACR;QAEA,IAAI,CAACC,gBACD,OAAOL,OAAO,IAAI,CAACC,wBAAwB,SAAS,CAACJ;QAGzD,MAAMS,aAAa,MAAM,IAAI,CAAC,6BAA6B,CAAC,MAAM,CAAIT,OAAOO;QAC7E,IAAIE,WAAW,MAAM,IACjB,OAAON,OAAO,IAAI,CAACM,WAAW,KAAK;QAEvC,MAAM,EAAEC,KAAK,EAAE,GAAGD,WAAW,KAAK;QAElC,IAAI;YACA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIE,wBAAwB;gBACxBD;gBACA,UAAUH;gBACVP;YACJ;YAGJ,MAAMY,mBAAmB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACZ,OAAOU;YAE9D,IAAIE,iBAAiB,MAAM,IAAI;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,uBAAuB;oBACvBH;oBACA,UAAUH;oBACVP;oBACA,OAAOY,iBAAiB,KAAK;gBACjC;gBAEJ,OAAOT,OAAO,IAAI,CAACS,iBAAiB,KAAK;YAC7C;YAEA,MAAME,iBAAiBF,iBAAiB,KAAK;YAE7C,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,uBAAuB;gBACvB,OAAOD;gBACP,UAAUP;gBACVP;YACJ;YAGJ,OAAOG,OAAO,EAAE,CAACO;QACrB,EAAE,OAAOM,OAAO;YACZ,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIH,uBAAuB;gBACvBH;gBACA,UAAUH;gBACVP;gBACA,OAAOgB;YACX;YAEJ,OAAOb,OAAO,IAAI,CAACa;QACvB;IACJ;AACJ;AAEO,MAAMC,0CAAsBC,qBAAqB;IACpD,aAAaC;IACb,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -1,5 +1,5 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../../../features/contentEntry/EntryEventPublisher/index.js";
3
3
  import { RepublishEntryUseCase as UseCaseAbstraction } from "./abstractions.js";
4
4
  import { RepublishEntryRepository } from "./abstractions.js";
5
5
  import { AccessControl } from "../../../features/shared/abstractions.js";
@@ -12,7 +12,7 @@ declare class RepublishEntryUseCaseImpl implements UseCaseAbstraction.Interface
12
12
  private getRevisionById;
13
13
  private eventPublisher;
14
14
  private createRepublishEntryDataFactory;
15
- constructor(repository: RepublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EventPublisher.Interface, createRepublishEntryDataFactory: CreateRepublishEntryDataFactory.Interface);
15
+ constructor(repository: RepublishEntryRepository.Interface, accessControl: AccessControl.Interface, getRevisionById: GetRevisionByIdUseCase.Interface, eventPublisher: EntryEventPublisher.Interface, createRepublishEntryDataFactory: CreateRepublishEntryDataFactory.Interface);
16
16
  execute<T extends CmsEntryValues = CmsEntryValues>(model: CmsModel, id: string): Promise<Result<CmsEntry<T>, UseCaseAbstraction.Error>>;
17
17
  }
18
18
  export declare const RepublishEntryUseCase: import("@webiny/di").Implementation<typeof RepublishEntryUseCaseImpl>;
@@ -1,5 +1,5 @@
1
1
  import { Result, createImplementation } from "@webiny/feature/api";
2
- import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
2
+ import { EntryEventPublisher } from "../EntryEventPublisher/index.js";
3
3
  import { RepublishEntryRepository, RepublishEntryUseCase } from "./abstractions.js";
4
4
  import { AccessControl } from "../../shared/abstractions.js";
5
5
  import { GetRevisionByIdUseCase } from "../GetRevisionById/index.js";
@@ -71,7 +71,7 @@ const RepublishEntryUseCase_RepublishEntryUseCase = createImplementation({
71
71
  RepublishEntryRepository,
72
72
  AccessControl,
73
73
  GetRevisionByIdUseCase,
74
- EventPublisher,
74
+ EntryEventPublisher,
75
75
  CreateRepublishEntryDataFactory
76
76
  ]
77
77
  });