@webiny/api-website-builder 0.0.0-unstable.ac6ebf63c6 → 0.0.0-unstable.dbdf5d6258

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 (122) hide show
  1. package/domain/page/EntryToPageMapper.js +2 -1
  2. package/domain/page/EntryToPageMapper.js.map +1 -1
  3. package/domain/page/abstractions.d.ts +3 -2
  4. package/domain/page/abstractions.js.map +1 -1
  5. package/domain/permissions.d.ts +133 -0
  6. package/domain/permissions.js +35 -0
  7. package/domain/permissions.js.map +1 -0
  8. package/features/installer/ApiKeyInstaller.d.ts +3 -1
  9. package/features/installer/ApiKeyInstaller.js +12 -5
  10. package/features/installer/ApiKeyInstaller.js.map +1 -1
  11. package/features/pages/CreatePage/CreatePageUseCase.d.ts +3 -1
  12. package/features/pages/CreatePage/CreatePageUseCase.js +10 -2
  13. package/features/pages/CreatePage/CreatePageUseCase.js.map +1 -1
  14. package/features/pages/CreatePage/abstractions.d.ts +2 -1
  15. package/features/pages/CreatePage/abstractions.js.map +1 -1
  16. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.d.ts +5 -1
  17. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js +18 -2
  18. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js.map +1 -1
  19. package/features/pages/CreatePageRevisionFrom/abstractions.d.ts +2 -1
  20. package/features/pages/CreatePageRevisionFrom/abstractions.js.map +1 -1
  21. package/features/pages/DeletePage/DeletePageUseCase.d.ts +3 -1
  22. package/features/pages/DeletePage/DeletePageUseCase.js +10 -3
  23. package/features/pages/DeletePage/DeletePageUseCase.js.map +1 -1
  24. package/features/pages/DeletePage/abstractions.d.ts +2 -1
  25. package/features/pages/DeletePage/abstractions.js.map +1 -1
  26. package/features/pages/DuplicatePage/DuplicatePageUseCase.d.ts +3 -1
  27. package/features/pages/DuplicatePage/DuplicatePageUseCase.js +10 -2
  28. package/features/pages/DuplicatePage/DuplicatePageUseCase.js.map +1 -1
  29. package/features/pages/DuplicatePage/abstractions.d.ts +2 -1
  30. package/features/pages/DuplicatePage/abstractions.js.map +1 -1
  31. package/features/pages/GetPageById/GetPageByIdUseCase.d.ts +3 -1
  32. package/features/pages/GetPageById/GetPageByIdUseCase.js +19 -3
  33. package/features/pages/GetPageById/GetPageByIdUseCase.js.map +1 -1
  34. package/features/pages/GetPageById/abstractions.d.ts +2 -1
  35. package/features/pages/GetPageById/abstractions.js.map +1 -1
  36. package/features/pages/GetPageByPath/GetPageByPathUseCase.d.ts +3 -1
  37. package/features/pages/GetPageByPath/GetPageByPathUseCase.js +19 -3
  38. package/features/pages/GetPageByPath/GetPageByPathUseCase.js.map +1 -1
  39. package/features/pages/GetPageByPath/abstractions.d.ts +2 -1
  40. package/features/pages/GetPageByPath/abstractions.js.map +1 -1
  41. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.d.ts +3 -1
  42. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js +22 -3
  43. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js.map +1 -1
  44. package/features/pages/GetPageRevisions/abstractions.d.ts +2 -1
  45. package/features/pages/GetPageRevisions/abstractions.js.map +1 -1
  46. package/features/pages/ListPages/ListPagesRepository.d.ts +5 -1
  47. package/features/pages/ListPages/ListPagesRepository.js +14 -4
  48. package/features/pages/ListPages/ListPagesRepository.js.map +1 -1
  49. package/features/pages/ListPages/ListPagesUseCase.d.ts +5 -1
  50. package/features/pages/ListPages/ListPagesUseCase.js +24 -4
  51. package/features/pages/ListPages/ListPagesUseCase.js.map +1 -1
  52. package/features/pages/ListPages/abstractions.d.ts +2 -1
  53. package/features/pages/ListPages/abstractions.js.map +1 -1
  54. package/features/pages/MovePage/MovePageUseCase.d.ts +3 -1
  55. package/features/pages/MovePage/MovePageUseCase.js +14 -2
  56. package/features/pages/MovePage/MovePageUseCase.js.map +1 -1
  57. package/features/pages/MovePage/abstractions.d.ts +2 -1
  58. package/features/pages/MovePage/abstractions.js.map +1 -1
  59. package/features/pages/PublishPage/PublishPageUseCase.d.ts +3 -1
  60. package/features/pages/PublishPage/PublishPageUseCase.js +14 -2
  61. package/features/pages/PublishPage/PublishPageUseCase.js.map +1 -1
  62. package/features/pages/PublishPage/abstractions.d.ts +2 -1
  63. package/features/pages/PublishPage/abstractions.js.map +1 -1
  64. package/features/pages/UnpublishPage/UnpublishPageUseCase.d.ts +3 -1
  65. package/features/pages/UnpublishPage/UnpublishPageUseCase.js +14 -2
  66. package/features/pages/UnpublishPage/UnpublishPageUseCase.js.map +1 -1
  67. package/features/pages/UnpublishPage/abstractions.d.ts +2 -1
  68. package/features/pages/UnpublishPage/abstractions.js.map +1 -1
  69. package/features/pages/UpdatePage/UpdatePageUseCase.d.ts +3 -1
  70. package/features/pages/UpdatePage/UpdatePageUseCase.js +14 -2
  71. package/features/pages/UpdatePage/UpdatePageUseCase.js.map +1 -1
  72. package/features/pages/UpdatePage/abstractions.d.ts +5 -5
  73. package/features/pages/UpdatePage/abstractions.js.map +1 -1
  74. package/features/redirects/CreateRedirect/CreateRedirectUseCase.d.ts +3 -1
  75. package/features/redirects/CreateRedirect/CreateRedirectUseCase.js +10 -2
  76. package/features/redirects/CreateRedirect/CreateRedirectUseCase.js.map +1 -1
  77. package/features/redirects/CreateRedirect/abstractions.d.ts +2 -1
  78. package/features/redirects/CreateRedirect/abstractions.js.map +1 -1
  79. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.d.ts +3 -1
  80. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js +10 -3
  81. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js.map +1 -1
  82. package/features/redirects/DeleteRedirect/abstractions.d.ts +2 -1
  83. package/features/redirects/DeleteRedirect/abstractions.js.map +1 -1
  84. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.d.ts +3 -1
  85. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js +10 -3
  86. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js.map +1 -1
  87. package/features/redirects/GetActiveRedirects/abstractions.d.ts +2 -1
  88. package/features/redirects/GetActiveRedirects/abstractions.js.map +1 -1
  89. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.d.ts +3 -1
  90. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js +19 -4
  91. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js.map +1 -1
  92. package/features/redirects/GetRedirectById/abstractions.d.ts +2 -1
  93. package/features/redirects/GetRedirectById/abstractions.js.map +1 -1
  94. package/features/redirects/ListRedirects/ListRedirectsUseCase.d.ts +5 -1
  95. package/features/redirects/ListRedirects/ListRedirectsUseCase.js +23 -4
  96. package/features/redirects/ListRedirects/ListRedirectsUseCase.js.map +1 -1
  97. package/features/redirects/ListRedirects/abstractions.d.ts +3 -1
  98. package/features/redirects/ListRedirects/abstractions.js.map +1 -1
  99. package/features/redirects/MoveRedirect/MoveRedirectUseCase.d.ts +3 -1
  100. package/features/redirects/MoveRedirect/MoveRedirectUseCase.js +14 -2
  101. package/features/redirects/MoveRedirect/MoveRedirectUseCase.js.map +1 -1
  102. package/features/redirects/MoveRedirect/abstractions.d.ts +2 -1
  103. package/features/redirects/MoveRedirect/abstractions.js.map +1 -1
  104. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.d.ts +3 -1
  105. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js +14 -2
  106. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js.map +1 -1
  107. package/features/redirects/UpdateRedirect/abstractions.d.ts +2 -1
  108. package/features/redirects/UpdateRedirect/abstractions.js.map +1 -1
  109. package/features/tenantManager/TenantModelExtension.js +5 -5
  110. package/features/tenantManager/TenantModelExtension.js.map +1 -1
  111. package/graphql/pages/pages.typeDefs.d.ts +1 -1
  112. package/graphql/pages/pages.typeDefs.js +6 -0
  113. package/graphql/pages/pages.typeDefs.js.map +1 -1
  114. package/index.js +4 -4
  115. package/index.js.map +1 -1
  116. package/package.json +19 -20
  117. package/features/pages/PagePermissions/feature.d.ts +0 -1
  118. package/features/pages/PagePermissions/feature.js +0 -53
  119. package/features/pages/PagePermissions/feature.js.map +0 -1
  120. package/features/redirects/RedirectPermissions/feature.d.ts +0 -1
  121. package/features/redirects/RedirectPermissions/feature.js +0 -45
  122. package/features/redirects/RedirectPermissions/feature.js.map +0 -1
@@ -17,7 +17,8 @@ export class EntryToPageMapper {
17
17
  modifiedOn: entry.modifiedOn ?? null,
18
18
  modifiedBy: entry.modifiedBy ?? null,
19
19
  tenant: entry.tenant,
20
- state: entry.state,
20
+ system: entry.system,
21
+ live: entry.live,
21
22
  properties: entry.values.properties,
22
23
  metadata: entry.values.metadata,
23
24
  bindings: entry.values.bindings,
@@ -1 +1 @@
1
- {"version":3,"names":["ROOT_FOLDER","EntryToPageMapper","toPage","entry","id","entryId","location","folderId","status","version","locked","createdOn","createdBy","savedOn","savedBy","modifiedOn","modifiedBy","tenant","state","properties","values","metadata","bindings","elements","extensions"],"sources":["EntryToPageMapper.ts"],"sourcesContent":["import type { CmsEntry } from \"@webiny/api-headless-cms/types\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\n\nexport class EntryToPageMapper {\n static toPage(entry: CmsEntry): WbPage {\n return {\n id: entry.id,\n entryId: entry.entryId,\n location: {\n folderId: entry.location?.folderId ?? ROOT_FOLDER\n },\n status: entry.status,\n version: entry.version,\n locked: entry.locked,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n savedOn: entry.savedOn,\n savedBy: entry.savedBy,\n modifiedOn: entry.modifiedOn ?? null,\n modifiedBy: entry.modifiedBy ?? null,\n tenant: entry.tenant,\n state: entry.state,\n properties: entry.values.properties,\n metadata: entry.values.metadata,\n bindings: entry.values.bindings,\n elements: entry.values.elements,\n extensions: entry.values.extensions\n };\n }\n}\n"],"mappings":"AAEA,SAASA,WAAW;AAEpB,OAAO,MAAMC,iBAAiB,CAAC;EAC3B,OAAOC,MAAMA,CAACC,KAAe,EAAU;IACnC,OAAO;MACHC,EAAE,EAAED,KAAK,CAACC,EAAE;MACZC,OAAO,EAAEF,KAAK,CAACE,OAAO;MACtBC,QAAQ,EAAE;QACNC,QAAQ,EAAEJ,KAAK,CAACG,QAAQ,EAAEC,QAAQ,IAAIP;MAC1C,CAAC;MACDQ,MAAM,EAAEL,KAAK,CAACK,MAAM;MACpBC,OAAO,EAAEN,KAAK,CAACM,OAAO;MACtBC,MAAM,EAAEP,KAAK,CAACO,MAAM;MACpBC,SAAS,EAAER,KAAK,CAACQ,SAAS;MAC1BC,SAAS,EAAET,KAAK,CAACS,SAAS;MAC1BC,OAAO,EAAEV,KAAK,CAACU,OAAO;MACtBC,OAAO,EAAEX,KAAK,CAACW,OAAO;MACtBC,UAAU,EAAEZ,KAAK,CAACY,UAAU,IAAI,IAAI;MACpCC,UAAU,EAAEb,KAAK,CAACa,UAAU,IAAI,IAAI;MACpCC,MAAM,EAAEd,KAAK,CAACc,MAAM;MACpBC,KAAK,EAAEf,KAAK,CAACe,KAAK;MAClBC,UAAU,EAAEhB,KAAK,CAACiB,MAAM,CAACD,UAAU;MACnCE,QAAQ,EAAElB,KAAK,CAACiB,MAAM,CAACC,QAAQ;MAC/BC,QAAQ,EAAEnB,KAAK,CAACiB,MAAM,CAACE,QAAQ;MAC/BC,QAAQ,EAAEpB,KAAK,CAACiB,MAAM,CAACG,QAAQ;MAC/BC,UAAU,EAAErB,KAAK,CAACiB,MAAM,CAACI;IAC7B,CAAC;EACL;AACJ","ignoreList":[]}
1
+ {"version":3,"names":["ROOT_FOLDER","EntryToPageMapper","toPage","entry","id","entryId","location","folderId","status","version","locked","createdOn","createdBy","savedOn","savedBy","modifiedOn","modifiedBy","tenant","system","live","properties","values","metadata","bindings","elements","extensions"],"sources":["EntryToPageMapper.ts"],"sourcesContent":["import type { CmsEntry } from \"@webiny/api-headless-cms/types\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\n\nexport class EntryToPageMapper {\n static toPage(entry: CmsEntry): WbPage {\n return {\n id: entry.id,\n entryId: entry.entryId,\n location: {\n folderId: entry.location?.folderId ?? ROOT_FOLDER\n },\n status: entry.status,\n version: entry.version,\n locked: entry.locked,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n savedOn: entry.savedOn,\n savedBy: entry.savedBy,\n modifiedOn: entry.modifiedOn ?? null,\n modifiedBy: entry.modifiedBy ?? null,\n tenant: entry.tenant,\n system: entry.system,\n live: entry.live,\n properties: entry.values.properties,\n metadata: entry.values.metadata,\n bindings: entry.values.bindings,\n elements: entry.values.elements,\n extensions: entry.values.extensions\n };\n }\n}\n"],"mappings":"AAEA,SAASA,WAAW;AAEpB,OAAO,MAAMC,iBAAiB,CAAC;EAC3B,OAAOC,MAAMA,CAACC,KAAe,EAAU;IACnC,OAAO;MACHC,EAAE,EAAED,KAAK,CAACC,EAAE;MACZC,OAAO,EAAEF,KAAK,CAACE,OAAO;MACtBC,QAAQ,EAAE;QACNC,QAAQ,EAAEJ,KAAK,CAACG,QAAQ,EAAEC,QAAQ,IAAIP;MAC1C,CAAC;MACDQ,MAAM,EAAEL,KAAK,CAACK,MAAM;MACpBC,OAAO,EAAEN,KAAK,CAACM,OAAO;MACtBC,MAAM,EAAEP,KAAK,CAACO,MAAM;MACpBC,SAAS,EAAER,KAAK,CAACQ,SAAS;MAC1BC,SAAS,EAAET,KAAK,CAACS,SAAS;MAC1BC,OAAO,EAAEV,KAAK,CAACU,OAAO;MACtBC,OAAO,EAAEX,KAAK,CAACW,OAAO;MACtBC,UAAU,EAAEZ,KAAK,CAACY,UAAU,IAAI,IAAI;MACpCC,UAAU,EAAEb,KAAK,CAACa,UAAU,IAAI,IAAI;MACpCC,MAAM,EAAEd,KAAK,CAACc,MAAM;MACpBC,MAAM,EAAEf,KAAK,CAACe,MAAM;MACpBC,IAAI,EAAEhB,KAAK,CAACgB,IAAI;MAChBC,UAAU,EAAEjB,KAAK,CAACkB,MAAM,CAACD,UAAU;MACnCE,QAAQ,EAAEnB,KAAK,CAACkB,MAAM,CAACC,QAAQ;MAC/BC,QAAQ,EAAEpB,KAAK,CAACkB,MAAM,CAACE,QAAQ;MAC/BC,QAAQ,EAAErB,KAAK,CAACkB,MAAM,CAACG,QAAQ;MAC/BC,UAAU,EAAEtB,KAAK,CAACkB,MAAM,CAACI;IAC7B,CAAC;EACL;AACJ","ignoreList":[]}
@@ -1,4 +1,4 @@
1
- import type { CmsModel, IEntryState } from "@webiny/api-headless-cms/types/index.js";
1
+ import type { CmsModel, ICmsEntryLive, ICmsEntrySystem } from "@webiny/api-headless-cms/types/index.js";
2
2
  import type { WbIdentity, WbLocation } from "../../domain/shared/abstractions.js";
3
3
  export interface CmsEntryWbPage {
4
4
  properties: Record<string, any>;
@@ -21,7 +21,8 @@ export interface WbPage extends CmsEntryWbPage {
21
21
  modifiedOn: string | null;
22
22
  modifiedBy: WbIdentity | null;
23
23
  tenant: string;
24
- state?: IEntryState;
24
+ system?: ICmsEntrySystem;
25
+ live: ICmsEntryLive | null;
25
26
  }
26
27
  /**
27
28
  * PageModel abstraction - represents the Website Builder page CMS model.
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","PageModel"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsModel, IEntryState } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { WbIdentity, WbLocation } from \"~/domain/shared/abstractions.js\";\n\nexport interface CmsEntryWbPage {\n properties: Record<string, any>;\n metadata: Record<string, any>;\n bindings: Record<string, any>;\n elements: Record<string, any>;\n extensions?: Record<string, any>;\n}\n\nexport interface WbPage extends CmsEntryWbPage {\n id: string;\n entryId: string;\n location: WbLocation;\n status: string;\n version: number;\n locked: boolean;\n createdOn: string;\n createdBy: WbIdentity;\n savedOn: string;\n savedBy: WbIdentity;\n modifiedOn: string | null;\n modifiedBy: WbIdentity | null;\n tenant: string;\n state?: IEntryState;\n}\n\n/**\n * PageModel abstraction - represents the Website Builder page CMS model.\n * This will be registered via container.registerInstance in the composite feature.\n */\nexport const PageModel = createAbstraction<CmsModel>(\"Wb/PageModel\");\n\nexport namespace PageModel {\n export type Interface = CmsModel;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AA6BvD;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGD,iBAAiB,CAAW,cAAc,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","PageModel"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type {\n CmsModel,\n ICmsEntryLive,\n ICmsEntrySystem\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { WbIdentity, WbLocation } from \"~/domain/shared/abstractions.js\";\n\nexport interface CmsEntryWbPage {\n properties: Record<string, any>;\n metadata: Record<string, any>;\n bindings: Record<string, any>;\n elements: Record<string, any>;\n extensions?: Record<string, any>;\n}\n\nexport interface WbPage extends CmsEntryWbPage {\n id: string;\n entryId: string;\n location: WbLocation;\n status: string;\n version: number;\n locked: boolean;\n createdOn: string;\n createdBy: WbIdentity;\n savedOn: string;\n savedBy: WbIdentity;\n modifiedOn: string | null;\n modifiedBy: WbIdentity | null;\n tenant: string;\n system?: ICmsEntrySystem;\n live: ICmsEntryLive | null;\n}\n\n/**\n * PageModel abstraction - represents the Website Builder page CMS model.\n * This will be registered via container.registerInstance in the composite feature.\n */\nexport const PageModel = createAbstraction<CmsModel>(\"Wb/PageModel\");\n\nexport namespace PageModel {\n export type Interface = CmsModel;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAkCvD;AACA;AACA;AACA;AACA,OAAO,MAAMC,SAAS,GAAGD,iBAAiB,CAAW,cAAc,CAAC","ignoreList":[]}
@@ -0,0 +1,133 @@
1
+ import type { Permissions } from "@webiny/api-core/features/security/permissions/index.js";
2
+ declare const schema: {
3
+ readonly prefix: "wb";
4
+ readonly fullAccess: {
5
+ readonly name: "wb.*";
6
+ };
7
+ readonly entities: readonly [{
8
+ readonly id: "page";
9
+ readonly permission: "wb.page";
10
+ readonly scopes: readonly ["full", "own"];
11
+ readonly actions: readonly [{
12
+ readonly name: "rwd";
13
+ }, {
14
+ readonly name: "pw";
15
+ }];
16
+ }, {
17
+ readonly id: "redirect";
18
+ readonly permission: "wb.redirect";
19
+ readonly scopes: readonly ["full", "own"];
20
+ readonly actions: readonly [{
21
+ readonly name: "rwd";
22
+ }];
23
+ }, {
24
+ readonly id: "settings";
25
+ readonly permission: "wb.settings";
26
+ readonly scopes: readonly ["full"];
27
+ }, {
28
+ readonly id: "integrations";
29
+ readonly permission: "wb.integrations";
30
+ readonly scopes: readonly ["full"];
31
+ }];
32
+ };
33
+ type WbSchema = typeof schema;
34
+ export declare const WbPermissions: {
35
+ Abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
36
+ readonly prefix: "wb";
37
+ readonly fullAccess: {
38
+ readonly name: "wb.*";
39
+ };
40
+ readonly entities: readonly [{
41
+ readonly id: "page";
42
+ readonly permission: "wb.page";
43
+ readonly scopes: readonly ["full", "own"];
44
+ readonly actions: readonly [{
45
+ readonly name: "rwd";
46
+ }, {
47
+ readonly name: "pw";
48
+ }];
49
+ }, {
50
+ readonly id: "redirect";
51
+ readonly permission: "wb.redirect";
52
+ readonly scopes: readonly ["full", "own"];
53
+ readonly actions: readonly [{
54
+ readonly name: "rwd";
55
+ }];
56
+ }, {
57
+ readonly id: "settings";
58
+ readonly permission: "wb.settings";
59
+ readonly scopes: readonly ["full"];
60
+ }, {
61
+ readonly id: "integrations";
62
+ readonly permission: "wb.integrations";
63
+ readonly scopes: readonly ["full"];
64
+ }];
65
+ }>>;
66
+ Implementation: import("@webiny/di").Constructor<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
67
+ readonly prefix: "wb";
68
+ readonly fullAccess: {
69
+ readonly name: "wb.*";
70
+ };
71
+ readonly entities: readonly [{
72
+ readonly id: "page";
73
+ readonly permission: "wb.page";
74
+ readonly scopes: readonly ["full", "own"];
75
+ readonly actions: readonly [{
76
+ readonly name: "rwd";
77
+ }, {
78
+ readonly name: "pw";
79
+ }];
80
+ }, {
81
+ readonly id: "redirect";
82
+ readonly permission: "wb.redirect";
83
+ readonly scopes: readonly ["full", "own"];
84
+ readonly actions: readonly [{
85
+ readonly name: "rwd";
86
+ }];
87
+ }, {
88
+ readonly id: "settings";
89
+ readonly permission: "wb.settings";
90
+ readonly scopes: readonly ["full"];
91
+ }, {
92
+ readonly id: "integrations";
93
+ readonly permission: "wb.integrations";
94
+ readonly scopes: readonly ["full"];
95
+ }];
96
+ }>> & {
97
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
98
+ readonly prefix: "wb";
99
+ readonly fullAccess: {
100
+ readonly name: "wb.*";
101
+ };
102
+ readonly entities: readonly [{
103
+ readonly id: "page";
104
+ readonly permission: "wb.page";
105
+ readonly scopes: readonly ["full", "own"];
106
+ readonly actions: readonly [{
107
+ readonly name: "rwd";
108
+ }, {
109
+ readonly name: "pw";
110
+ }];
111
+ }, {
112
+ readonly id: "redirect";
113
+ readonly permission: "wb.redirect";
114
+ readonly scopes: readonly ["full", "own"];
115
+ readonly actions: readonly [{
116
+ readonly name: "rwd";
117
+ }];
118
+ }, {
119
+ readonly id: "settings";
120
+ readonly permission: "wb.settings";
121
+ readonly scopes: readonly ["full"];
122
+ }, {
123
+ readonly id: "integrations";
124
+ readonly permission: "wb.integrations";
125
+ readonly scopes: readonly ["full"];
126
+ }];
127
+ }>>;
128
+ };
129
+ };
130
+ export declare namespace WbPermissions {
131
+ type Interface = Permissions<WbSchema>;
132
+ }
133
+ export {};
@@ -0,0 +1,35 @@
1
+ import { createPermissions } from "@webiny/api-core/features/security/permissions/index.js";
2
+ const schema = {
3
+ prefix: "wb",
4
+ fullAccess: {
5
+ name: "wb.*"
6
+ },
7
+ entities: [{
8
+ id: "page",
9
+ permission: "wb.page",
10
+ scopes: ["full", "own"],
11
+ actions: [{
12
+ name: "rwd"
13
+ }, {
14
+ name: "pw"
15
+ }]
16
+ }, {
17
+ id: "redirect",
18
+ permission: "wb.redirect",
19
+ scopes: ["full", "own"],
20
+ actions: [{
21
+ name: "rwd"
22
+ }]
23
+ }, {
24
+ id: "settings",
25
+ permission: "wb.settings",
26
+ scopes: ["full"]
27
+ }, {
28
+ id: "integrations",
29
+ permission: "wb.integrations",
30
+ scopes: ["full"]
31
+ }]
32
+ };
33
+ export const WbPermissions = createPermissions(schema);
34
+
35
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPermissions","schema","prefix","fullAccess","name","entities","id","permission","scopes","actions","WbPermissions"],"sources":["permissions.ts"],"sourcesContent":["import { createPermissions } from \"@webiny/api-core/features/security/permissions/index.js\";\nimport type { Permissions } from \"@webiny/api-core/features/security/permissions/index.js\";\n\nconst schema = {\n prefix: \"wb\",\n fullAccess: { name: \"wb.*\" },\n entities: [\n {\n id: \"page\",\n permission: \"wb.page\",\n scopes: [\"full\", \"own\"],\n actions: [{ name: \"rwd\" }, { name: \"pw\" }]\n },\n {\n id: \"redirect\",\n permission: \"wb.redirect\",\n scopes: [\"full\", \"own\"],\n actions: [{ name: \"rwd\" }]\n },\n {\n id: \"settings\",\n permission: \"wb.settings\",\n scopes: [\"full\"]\n },\n {\n id: \"integrations\",\n permission: \"wb.integrations\",\n scopes: [\"full\"]\n }\n ]\n} as const;\n\ntype WbSchema = typeof schema;\n\nexport const WbPermissions = createPermissions(schema);\n\nexport namespace WbPermissions {\n export type Interface = Permissions<WbSchema>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,yDAAyD;AAG3F,MAAMC,MAAM,GAAG;EACXC,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE;IAAEC,IAAI,EAAE;EAAO,CAAC;EAC5BC,QAAQ,EAAE,CACN;IACIC,EAAE,EAAE,MAAM;IACVC,UAAU,EAAE,SAAS;IACrBC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvBC,OAAO,EAAE,CAAC;MAAEL,IAAI,EAAE;IAAM,CAAC,EAAE;MAAEA,IAAI,EAAE;IAAK,CAAC;EAC7C,CAAC,EACD;IACIE,EAAE,EAAE,UAAU;IACdC,UAAU,EAAE,aAAa;IACzBC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvBC,OAAO,EAAE,CAAC;MAAEL,IAAI,EAAE;IAAM,CAAC;EAC7B,CAAC,EACD;IACIE,EAAE,EAAE,UAAU;IACdC,UAAU,EAAE,aAAa;IACzBC,MAAM,EAAE,CAAC,MAAM;EACnB,CAAC,EACD;IACIF,EAAE,EAAE,cAAc;IAClBC,UAAU,EAAE,iBAAiB;IAC7BC,MAAM,EAAE,CAAC,MAAM;EACnB,CAAC;AAET,CAAU;AAIV,OAAO,MAAME,aAAa,GAAGV,iBAAiB,CAACC,MAAM,CAAC","ignoreList":[]}
@@ -1,14 +1,16 @@
1
1
  import { AppInstaller } from "@webiny/api-core/features/InstallTenant";
2
2
  import { CreateApiKeyUseCase } from "@webiny/api-core/features/security/apiKeys/CreateApiKey/index.js";
3
3
  import { DeleteApiKeyUseCase } from "@webiny/api-core/features/security/apiKeys/DeleteApiKey/index.js";
4
+ import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
4
5
  declare class ApiKeyInstallerImpl implements AppInstaller.Interface {
6
+ private wcpContext;
5
7
  private createApiKey;
6
8
  private deleteApiKey;
7
9
  readonly alwaysRun = true;
8
10
  readonly appName = "WebsiteBuilder";
9
11
  readonly dependsOn: never[];
10
12
  private apiKey;
11
- constructor(createApiKey: CreateApiKeyUseCase.Interface, deleteApiKey: DeleteApiKeyUseCase.Interface);
13
+ constructor(wcpContext: WcpContext.Interface, createApiKey: CreateApiKeyUseCase.Interface, deleteApiKey: DeleteApiKeyUseCase.Interface);
12
14
  install(): Promise<void>;
13
15
  uninstall(): Promise<void>;
14
16
  }
@@ -1,23 +1,30 @@
1
1
  import { AppInstaller } from "@webiny/api-core/features/InstallTenant";
2
2
  import { CreateApiKeyUseCase } from "@webiny/api-core/features/security/apiKeys/CreateApiKey/index.js";
3
3
  import { DeleteApiKeyUseCase } from "@webiny/api-core/features/security/apiKeys/DeleteApiKey/index.js";
4
+ import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
4
5
  class ApiKeyInstallerImpl {
5
6
  alwaysRun = true;
6
7
  appName = "WebsiteBuilder";
7
8
  dependsOn = [];
8
9
  apiKey = undefined;
9
- constructor(createApiKey, deleteApiKey) {
10
+ constructor(wcpContext, createApiKey, deleteApiKey) {
11
+ this.wcpContext = wcpContext;
10
12
  this.createApiKey = createApiKey;
11
13
  this.deleteApiKey = deleteApiKey;
12
14
  }
13
15
  async install() {
16
+ const aacl = this.wcpContext.canUseAacl();
17
+ const permissions = aacl ? [{
18
+ name: "wb.page",
19
+ rwd: "r"
20
+ }] : [{
21
+ name: "wb.*"
22
+ }];
14
23
  const result = await this.createApiKey.execute({
15
24
  name: "Website Builder",
16
25
  description: "Integrate Next.js or custom frontend with Website Builder.",
17
26
  slug: "website-builder",
18
- permissions: [{
19
- name: "wb.*"
20
- }]
27
+ permissions
21
28
  });
22
29
  if (result.isOk()) {
23
30
  this.apiKey = result.value;
@@ -31,7 +38,7 @@ class ApiKeyInstallerImpl {
31
38
  }
32
39
  export const ApiKeyInstaller = AppInstaller.createImplementation({
33
40
  implementation: ApiKeyInstallerImpl,
34
- dependencies: [CreateApiKeyUseCase, DeleteApiKeyUseCase]
41
+ dependencies: [WcpContext, CreateApiKeyUseCase, DeleteApiKeyUseCase]
35
42
  });
36
43
 
37
44
  //# sourceMappingURL=ApiKeyInstaller.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["AppInstaller","CreateApiKeyUseCase","DeleteApiKeyUseCase","ApiKeyInstallerImpl","alwaysRun","appName","dependsOn","apiKey","undefined","constructor","createApiKey","deleteApiKey","install","result","execute","name","description","slug","permissions","isOk","value","uninstall","id","ApiKeyInstaller","createImplementation","implementation","dependencies"],"sources":["ApiKeyInstaller.ts"],"sourcesContent":["import { AppInstaller } from \"@webiny/api-core/features/InstallTenant\";\nimport { CreateApiKeyUseCase } from \"@webiny/api-core/features/security/apiKeys/CreateApiKey/index.js\";\nimport { DeleteApiKeyUseCase } from \"@webiny/api-core/features/security/apiKeys/DeleteApiKey/index.js\";\nimport type { ApiKey } from \"@webiny/api-core/types/security.js\";\n\nclass ApiKeyInstallerImpl implements AppInstaller.Interface {\n readonly alwaysRun = true;\n readonly appName = \"WebsiteBuilder\";\n readonly dependsOn = [];\n private apiKey: ApiKey | undefined = undefined;\n\n constructor(\n private createApiKey: CreateApiKeyUseCase.Interface,\n private deleteApiKey: DeleteApiKeyUseCase.Interface\n ) {}\n\n async install(): Promise<void> {\n const result = await this.createApiKey.execute({\n name: \"Website Builder\",\n description: \"Integrate Next.js or custom frontend with Website Builder.\",\n slug: \"website-builder\",\n permissions: [{ name: \"wb.*\" }]\n });\n\n if (result.isOk()) {\n this.apiKey = result.value;\n }\n }\n\n async uninstall(): Promise<void> {\n if (this.apiKey) {\n await this.deleteApiKey.execute(this.apiKey.id);\n }\n }\n}\n\nexport const ApiKeyInstaller = AppInstaller.createImplementation({\n implementation: ApiKeyInstallerImpl,\n dependencies: [CreateApiKeyUseCase, DeleteApiKeyUseCase]\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yCAAyC;AACtE,SAASC,mBAAmB,QAAQ,kEAAkE;AACtG,SAASC,mBAAmB,QAAQ,kEAAkE;AAGtG,MAAMC,mBAAmB,CAAmC;EAC/CC,SAAS,GAAG,IAAI;EAChBC,OAAO,GAAG,gBAAgB;EAC1BC,SAAS,GAAG,EAAE;EACfC,MAAM,GAAuBC,SAAS;EAE9CC,WAAWA,CACCC,YAA2C,EAC3CC,YAA2C,EACrD;IAAA,KAFUD,YAA2C,GAA3CA,YAA2C;IAAA,KAC3CC,YAA2C,GAA3CA,YAA2C;EACpD;EAEH,MAAMC,OAAOA,CAAA,EAAkB;IAC3B,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACH,YAAY,CAACI,OAAO,CAAC;MAC3CC,IAAI,EAAE,iBAAiB;MACvBC,WAAW,EAAE,4DAA4D;MACzEC,IAAI,EAAE,iBAAiB;MACvBC,WAAW,EAAE,CAAC;QAAEH,IAAI,EAAE;MAAO,CAAC;IAClC,CAAC,CAAC;IAEF,IAAIF,MAAM,CAACM,IAAI,CAAC,CAAC,EAAE;MACf,IAAI,CAACZ,MAAM,GAAGM,MAAM,CAACO,KAAK;IAC9B;EACJ;EAEA,MAAMC,SAASA,CAAA,EAAkB;IAC7B,IAAI,IAAI,CAACd,MAAM,EAAE;MACb,MAAM,IAAI,CAACI,YAAY,CAACG,OAAO,CAAC,IAAI,CAACP,MAAM,CAACe,EAAE,CAAC;IACnD;EACJ;AACJ;AAEA,OAAO,MAAMC,eAAe,GAAGvB,YAAY,CAACwB,oBAAoB,CAAC;EAC7DC,cAAc,EAAEtB,mBAAmB;EACnCuB,YAAY,EAAE,CAACzB,mBAAmB,EAAEC,mBAAmB;AAC3D,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["AppInstaller","CreateApiKeyUseCase","DeleteApiKeyUseCase","WcpContext","ApiKeyInstallerImpl","alwaysRun","appName","dependsOn","apiKey","undefined","constructor","wcpContext","createApiKey","deleteApiKey","install","aacl","canUseAacl","permissions","name","rwd","result","execute","description","slug","isOk","value","uninstall","id","ApiKeyInstaller","createImplementation","implementation","dependencies"],"sources":["ApiKeyInstaller.ts"],"sourcesContent":["import { AppInstaller } from \"@webiny/api-core/features/InstallTenant\";\nimport { CreateApiKeyUseCase } from \"@webiny/api-core/features/security/apiKeys/CreateApiKey/index.js\";\nimport { DeleteApiKeyUseCase } from \"@webiny/api-core/features/security/apiKeys/DeleteApiKey/index.js\";\nimport type { ApiKey } from \"@webiny/api-core/types/security.js\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\n\nclass ApiKeyInstallerImpl implements AppInstaller.Interface {\n readonly alwaysRun = true;\n readonly appName = \"WebsiteBuilder\";\n readonly dependsOn = [];\n private apiKey: ApiKey | undefined = undefined;\n\n constructor(\n private wcpContext: WcpContext.Interface,\n private createApiKey: CreateApiKeyUseCase.Interface,\n private deleteApiKey: DeleteApiKeyUseCase.Interface\n ) {}\n\n async install(): Promise<void> {\n const aacl = this.wcpContext.canUseAacl();\n\n const permissions = aacl ? [{ name: \"wb.page\", rwd: \"r\" }] : [{ name: \"wb.*\" }];\n\n const result = await this.createApiKey.execute({\n name: \"Website Builder\",\n description: \"Integrate Next.js or custom frontend with Website Builder.\",\n slug: \"website-builder\",\n permissions\n });\n\n if (result.isOk()) {\n this.apiKey = result.value;\n }\n }\n\n async uninstall(): Promise<void> {\n if (this.apiKey) {\n await this.deleteApiKey.execute(this.apiKey.id);\n }\n }\n}\n\nexport const ApiKeyInstaller = AppInstaller.createImplementation({\n implementation: ApiKeyInstallerImpl,\n dependencies: [WcpContext, CreateApiKeyUseCase, DeleteApiKeyUseCase]\n});\n"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yCAAyC;AACtE,SAASC,mBAAmB,QAAQ,kEAAkE;AACtG,SAASC,mBAAmB,QAAQ,kEAAkE;AAEtG,SAASC,UAAU,QAAQ,mDAAmD;AAE9E,MAAMC,mBAAmB,CAAmC;EAC/CC,SAAS,GAAG,IAAI;EAChBC,OAAO,GAAG,gBAAgB;EAC1BC,SAAS,GAAG,EAAE;EACfC,MAAM,GAAuBC,SAAS;EAE9CC,WAAWA,CACCC,UAAgC,EAChCC,YAA2C,EAC3CC,YAA2C,EACrD;IAAA,KAHUF,UAAgC,GAAhCA,UAAgC;IAAA,KAChCC,YAA2C,GAA3CA,YAA2C;IAAA,KAC3CC,YAA2C,GAA3CA,YAA2C;EACpD;EAEH,MAAMC,OAAOA,CAAA,EAAkB;IAC3B,MAAMC,IAAI,GAAG,IAAI,CAACJ,UAAU,CAACK,UAAU,CAAC,CAAC;IAEzC,MAAMC,WAAW,GAAGF,IAAI,GAAG,CAAC;MAAEG,IAAI,EAAE,SAAS;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC,GAAG,CAAC;MAAED,IAAI,EAAE;IAAO,CAAC,CAAC;IAE/E,MAAME,MAAM,GAAG,MAAM,IAAI,CAACR,YAAY,CAACS,OAAO,CAAC;MAC3CH,IAAI,EAAE,iBAAiB;MACvBI,WAAW,EAAE,4DAA4D;MACzEC,IAAI,EAAE,iBAAiB;MACvBN;IACJ,CAAC,CAAC;IAEF,IAAIG,MAAM,CAACI,IAAI,CAAC,CAAC,EAAE;MACf,IAAI,CAAChB,MAAM,GAAGY,MAAM,CAACK,KAAK;IAC9B;EACJ;EAEA,MAAMC,SAASA,CAAA,EAAkB;IAC7B,IAAI,IAAI,CAAClB,MAAM,EAAE;MACb,MAAM,IAAI,CAACK,YAAY,CAACQ,OAAO,CAAC,IAAI,CAACb,MAAM,CAACmB,EAAE,CAAC;IACnD;EACJ;AACJ;AAEA,OAAO,MAAMC,eAAe,GAAG5B,YAAY,CAAC6B,oBAAoB,CAAC;EAC7DC,cAAc,EAAE1B,mBAAmB;EACnC2B,YAAY,EAAE,CAAC5B,UAAU,EAAEF,mBAAmB,EAAEC,mBAAmB;AACvE,CAAC,CAAC","ignoreList":[]}
@@ -1,9 +1,11 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { CreatePageUseCase as UseCaseAbstraction, CreatePageRepository } from "./abstractions.js";
3
+ import { WbPermissions } from "../../../domain/permissions.js";
3
4
  declare class CreatePageUseCaseImpl implements UseCaseAbstraction.Interface {
5
+ private permissions;
4
6
  private eventPublisher;
5
7
  private repository;
6
- constructor(eventPublisher: EventPublisherAbstraction.Interface, repository: CreatePageRepository.Interface);
8
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, repository: CreatePageRepository.Interface);
7
9
  execute(data: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
8
10
  }
9
11
  export declare const CreatePageUseCase: typeof CreatePageUseCaseImpl & {
@@ -2,12 +2,20 @@ import { Result } from "@webiny/feature/api";
2
2
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
3
  import { CreatePageUseCase as UseCaseAbstraction, CreatePageRepository } from "./abstractions.js";
4
4
  import { PageBeforeCreateEvent, PageAfterCreateEvent } from "./events.js";
5
+ import { WbPermissions } from "../../../domain/permissions.js";
6
+ import { PageNotAuthorizedError } from "../../../domain/page/errors.js";
5
7
  class CreatePageUseCaseImpl {
6
- constructor(eventPublisher, repository) {
8
+ constructor(permissions, eventPublisher, repository) {
9
+ this.permissions = permissions;
7
10
  this.eventPublisher = eventPublisher;
8
11
  this.repository = repository;
9
12
  }
10
13
  async execute(data) {
14
+ const hasPermission = await this.permissions.canCreate("page");
15
+ if (!hasPermission) {
16
+ return Result.fail(new PageNotAuthorizedError());
17
+ }
18
+
11
19
  // Publish before create event
12
20
  const beforeCreateEvent = new PageBeforeCreateEvent({
13
21
  input: data
@@ -31,7 +39,7 @@ class CreatePageUseCaseImpl {
31
39
  }
32
40
  export const CreatePageUseCase = UseCaseAbstraction.createImplementation({
33
41
  implementation: CreatePageUseCaseImpl,
34
- dependencies: [EventPublisher, CreatePageRepository]
42
+ dependencies: [WbPermissions.Abstraction, EventPublisher, CreatePageRepository]
35
43
  });
36
44
 
37
45
  //# sourceMappingURL=CreatePageUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","EventPublisher","CreatePageUseCase","UseCaseAbstraction","CreatePageRepository","PageBeforeCreateEvent","PageAfterCreateEvent","CreatePageUseCaseImpl","constructor","eventPublisher","repository","execute","data","beforeCreateEvent","input","publish","result","isFail","page","value","afterCreateEvent","ok","createImplementation","implementation","dependencies"],"sources":["CreatePageUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport { CreatePageUseCase as UseCaseAbstraction, CreatePageRepository } from \"./abstractions.js\";\nimport { PageBeforeCreateEvent, PageAfterCreateEvent } from \"./events.js\";\n\nclass CreatePageUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private eventPublisher: EventPublisherAbstraction.Interface,\n private repository: CreatePageRepository.Interface\n ) {}\n\n async execute(data: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n // Publish before create event\n const beforeCreateEvent = new PageBeforeCreateEvent({ input: data });\n\n await this.eventPublisher.publish(beforeCreateEvent);\n\n // Execute the create operation\n const result = await this.repository.execute(data);\n\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n\n // Publish after create event\n const afterCreateEvent = new PageAfterCreateEvent({ page });\n\n await this.eventPublisher.publish(afterCreateEvent);\n\n return Result.ok(page);\n }\n}\n\nexport const CreatePageUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreatePageUseCaseImpl,\n dependencies: [EventPublisher, CreatePageRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,0CAA0C;AACjD,SAASC,iBAAiB,IAAIC,kBAAkB,EAAEC,oBAAoB;AACtE,SAASC,qBAAqB,EAAEC,oBAAoB;AAEpD,MAAMC,qBAAqB,CAAyC;EAChEC,WAAWA,CACCC,cAAmD,EACnDC,UAA0C,EACpD;IAAA,KAFUD,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,UAA0C,GAA1CA,UAA0C;EACnD;EAEH,MAAMC,OAAOA,CAACC,IAA+B,EAA6B;IACtE;IACA,MAAMC,iBAAiB,GAAG,IAAIR,qBAAqB,CAAC;MAAES,KAAK,EAAEF;IAAK,CAAC,CAAC;IAEpE,MAAM,IAAI,CAACH,cAAc,CAACM,OAAO,CAACF,iBAAiB,CAAC;;IAEpD;IACA,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACN,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC;IAElD,IAAII,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOD,MAAM;IACjB;IAEA,MAAME,IAAI,GAAGF,MAAM,CAACG,KAAK;;IAEzB;IACA,MAAMC,gBAAgB,GAAG,IAAId,oBAAoB,CAAC;MAAEY;IAAK,CAAC,CAAC;IAE3D,MAAM,IAAI,CAACT,cAAc,CAACM,OAAO,CAACK,gBAAgB,CAAC;IAEnD,OAAOpB,MAAM,CAACqB,EAAE,CAACH,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMhB,iBAAiB,GAAGC,kBAAkB,CAACmB,oBAAoB,CAAC;EACrEC,cAAc,EAAEhB,qBAAqB;EACrCiB,YAAY,EAAE,CAACvB,cAAc,EAAEG,oBAAoB;AACvD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","EventPublisher","CreatePageUseCase","UseCaseAbstraction","CreatePageRepository","PageBeforeCreateEvent","PageAfterCreateEvent","WbPermissions","PageNotAuthorizedError","CreatePageUseCaseImpl","constructor","permissions","eventPublisher","repository","execute","data","hasPermission","canCreate","fail","beforeCreateEvent","input","publish","result","isFail","page","value","afterCreateEvent","ok","createImplementation","implementation","dependencies","Abstraction"],"sources":["CreatePageUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport { CreatePageUseCase as UseCaseAbstraction, CreatePageRepository } from \"./abstractions.js\";\nimport { PageBeforeCreateEvent, PageAfterCreateEvent } from \"./events.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { PageNotAuthorizedError } from \"~/domain/page/errors.js\";\n\nclass CreatePageUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private repository: CreatePageRepository.Interface\n ) {}\n\n async execute(data: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canCreate(\"page\");\n if (!hasPermission) {\n return Result.fail(new PageNotAuthorizedError());\n }\n\n // Publish before create event\n const beforeCreateEvent = new PageBeforeCreateEvent({ input: data });\n\n await this.eventPublisher.publish(beforeCreateEvent);\n\n // Execute the create operation\n const result = await this.repository.execute(data);\n\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n\n // Publish after create event\n const afterCreateEvent = new PageAfterCreateEvent({ page });\n\n await this.eventPublisher.publish(afterCreateEvent);\n\n return Result.ok(page);\n }\n}\n\nexport const CreatePageUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreatePageUseCaseImpl,\n dependencies: [WbPermissions.Abstraction, EventPublisher, CreatePageRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,0CAA0C;AACjD,SAASC,iBAAiB,IAAIC,kBAAkB,EAAEC,oBAAoB;AACtE,SAASC,qBAAqB,EAAEC,oBAAoB;AACpD,SAASC,aAAa;AACtB,SAASC,sBAAsB;AAE/B,MAAMC,qBAAqB,CAAyC;EAChEC,WAAWA,CACCC,WAAoC,EACpCC,cAAmD,EACnDC,UAA0C,EACpD;IAAA,KAHUF,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,UAA0C,GAA1CA,UAA0C;EACnD;EAEH,MAAMC,OAAOA,CAACC,IAA+B,EAA6B;IACtE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACL,WAAW,CAACM,SAAS,CAAC,MAAM,CAAC;IAC9D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOhB,MAAM,CAACkB,IAAI,CAAC,IAAIV,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMW,iBAAiB,GAAG,IAAId,qBAAqB,CAAC;MAAEe,KAAK,EAAEL;IAAK,CAAC,CAAC;IAEpE,MAAM,IAAI,CAACH,cAAc,CAACS,OAAO,CAACF,iBAAiB,CAAC;;IAEpD;IACA,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACT,UAAU,CAACC,OAAO,CAACC,IAAI,CAAC;IAElD,IAAIO,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOD,MAAM;IACjB;IAEA,MAAME,IAAI,GAAGF,MAAM,CAACG,KAAK;;IAEzB;IACA,MAAMC,gBAAgB,GAAG,IAAIpB,oBAAoB,CAAC;MAAEkB;IAAK,CAAC,CAAC;IAE3D,MAAM,IAAI,CAACZ,cAAc,CAACS,OAAO,CAACK,gBAAgB,CAAC;IAEnD,OAAO1B,MAAM,CAAC2B,EAAE,CAACH,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMtB,iBAAiB,GAAGC,kBAAkB,CAACyB,oBAAoB,CAAC;EACrEC,cAAc,EAAEpB,qBAAqB;EACrCqB,YAAY,EAAE,CAACvB,aAAa,CAACwB,WAAW,EAAE9B,cAAc,EAAEG,oBAAoB;AAClF,CAAC,CAAC","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import { type Result } from "@webiny/feature/api";
2
2
  import type { DomainEvent, IEventHandler } from "@webiny/api-core/features/EventPublisher";
3
3
  import type { WbPage } from "../../../domain/page/abstractions.js";
4
- import { PagePersistenceError, PageValidationError } from "../../../domain/page/errors.js";
4
+ import { PagePersistenceError, PageValidationError, PageNotAuthorizedError } from "../../../domain/page/errors.js";
5
5
  export type ICreateWbPageParams = Pick<WbPage, "properties" | "metadata" | "bindings" | "elements" | "location" | "extensions">;
6
6
  export interface ICreatePageRepository {
7
7
  execute(data: ICreateWbPageParams): Promise<Result<WbPage, RepositoryError>>;
@@ -22,6 +22,7 @@ export interface ICreatePageUseCase {
22
22
  execute(data: ICreateWbPageParams): Promise<Result<WbPage, UseCaseError>>;
23
23
  }
24
24
  export interface ICreatePageUseCaseErrors {
25
+ notAuthorized: PageNotAuthorizedError;
25
26
  validation: PageValidationError;
26
27
  persistence: PagePersistenceError;
27
28
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","CreatePageRepository","CreatePageUseCase","PageBeforeCreateHandler","PageAfterCreateHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport { PagePersistenceError, PageValidationError } from \"~/domain/page/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport type ICreateWbPageParams = Pick<\n WbPage,\n \"properties\" | \"metadata\" | \"bindings\" | \"elements\" | \"location\" | \"extensions\"\n>;\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreatePageRepository {\n execute(data: ICreateWbPageParams): Promise<Result<WbPage, RepositoryError>>;\n}\n\nexport interface ICreatePageRepositoryErrors {\n validation: PageValidationError;\n persistence: PagePersistenceError;\n}\n\ntype RepositoryError = ICreatePageRepositoryErrors[keyof ICreatePageRepositoryErrors];\n\nexport const CreatePageRepository =\n createAbstraction<ICreatePageRepository>(\"Wb/CreatePageRepository\");\n\nexport namespace CreatePageRepository {\n export type Interface = ICreatePageRepository;\n export type Params = ICreateWbPageParams;\n export type Return = Promise<Result<WbPage, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreatePageUseCase {\n execute(data: ICreateWbPageParams): Promise<Result<WbPage, UseCaseError>>;\n}\n\nexport interface ICreatePageUseCaseErrors {\n validation: PageValidationError;\n persistence: PagePersistenceError;\n}\n\ntype UseCaseError = ICreatePageUseCaseErrors[keyof ICreatePageUseCaseErrors];\n\nexport const CreatePageUseCase = createAbstraction<ICreatePageUseCase>(\"Wb/CreatePageUseCase\");\n\nexport namespace CreatePageUseCase {\n export type Interface = ICreatePageUseCase;\n export type Params = ICreateWbPageParams;\n export type Return = Promise<Result<WbPage, UseCaseError>>;\n export type Error = UseCaseError;\n export type Page = WbPage;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface PageBeforeCreatePayload {\n input: ICreateWbPageParams;\n}\n\nexport interface PageAfterCreatePayload {\n page: WbPage;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const PageBeforeCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<PageBeforeCreatePayload>>\n>(\"Wb/PageBeforeCreateHandler\");\n\nexport namespace PageBeforeCreateHandler {\n export type Interface = IEventHandler<DomainEvent<PageBeforeCreatePayload>>;\n export type Event = DomainEvent<PageBeforeCreatePayload>;\n export type Page = WbPage;\n}\n\nexport const PageAfterCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<PageAfterCreatePayload>>\n>(\"Wb/PageAfterCreateHandler\");\n\nexport namespace PageAfterCreateHandler {\n export type Interface = IEventHandler<DomainEvent<PageAfterCreatePayload>>;\n export type Event = DomainEvent<PageAfterCreatePayload>;\n export type Page = WbPage;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAKpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,oBAAoB,GAC7BD,iBAAiB,CAAwB,yBAAyB,CAAC;;AASvE;AACA;AACA;;AAaA,OAAO,MAAME,iBAAiB,GAAGF,iBAAiB,CAAqB,sBAAsB,CAAC;;AAU9F;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,uBAAuB,GAAGH,iBAAiB,CAEtD,4BAA4B,CAAC;AAQ/B,OAAO,MAAMI,sBAAsB,GAAGJ,iBAAiB,CAErD,2BAA2B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","CreatePageRepository","CreatePageUseCase","PageBeforeCreateHandler","PageAfterCreateHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport {\n PagePersistenceError,\n PageValidationError,\n PageNotAuthorizedError\n} from \"~/domain/page/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport type ICreateWbPageParams = Pick<\n WbPage,\n \"properties\" | \"metadata\" | \"bindings\" | \"elements\" | \"location\" | \"extensions\"\n>;\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreatePageRepository {\n execute(data: ICreateWbPageParams): Promise<Result<WbPage, RepositoryError>>;\n}\n\nexport interface ICreatePageRepositoryErrors {\n validation: PageValidationError;\n persistence: PagePersistenceError;\n}\n\ntype RepositoryError = ICreatePageRepositoryErrors[keyof ICreatePageRepositoryErrors];\n\nexport const CreatePageRepository =\n createAbstraction<ICreatePageRepository>(\"Wb/CreatePageRepository\");\n\nexport namespace CreatePageRepository {\n export type Interface = ICreatePageRepository;\n export type Params = ICreateWbPageParams;\n export type Return = Promise<Result<WbPage, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreatePageUseCase {\n execute(data: ICreateWbPageParams): Promise<Result<WbPage, UseCaseError>>;\n}\n\nexport interface ICreatePageUseCaseErrors {\n notAuthorized: PageNotAuthorizedError;\n validation: PageValidationError;\n persistence: PagePersistenceError;\n}\n\ntype UseCaseError = ICreatePageUseCaseErrors[keyof ICreatePageUseCaseErrors];\n\nexport const CreatePageUseCase = createAbstraction<ICreatePageUseCase>(\"Wb/CreatePageUseCase\");\n\nexport namespace CreatePageUseCase {\n export type Interface = ICreatePageUseCase;\n export type Params = ICreateWbPageParams;\n export type Return = Promise<Result<WbPage, UseCaseError>>;\n export type Error = UseCaseError;\n export type Page = WbPage;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface PageBeforeCreatePayload {\n input: ICreateWbPageParams;\n}\n\nexport interface PageAfterCreatePayload {\n page: WbPage;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const PageBeforeCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<PageBeforeCreatePayload>>\n>(\"Wb/PageBeforeCreateHandler\");\n\nexport namespace PageBeforeCreateHandler {\n export type Interface = IEventHandler<DomainEvent<PageBeforeCreatePayload>>;\n export type Event = DomainEvent<PageBeforeCreatePayload>;\n export type Page = WbPage;\n}\n\nexport const PageAfterCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<PageAfterCreatePayload>>\n>(\"Wb/PageAfterCreateHandler\");\n\nexport namespace PageAfterCreateHandler {\n export type Interface = IEventHandler<DomainEvent<PageAfterCreatePayload>>;\n export type Event = DomainEvent<PageAfterCreatePayload>;\n export type Page = WbPage;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AASpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,oBAAoB,GAC7BD,iBAAiB,CAAwB,yBAAyB,CAAC;;AASvE;AACA;AACA;;AAcA,OAAO,MAAME,iBAAiB,GAAGF,iBAAiB,CAAqB,sBAAsB,CAAC;;AAU9F;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,uBAAuB,GAAGH,iBAAiB,CAEtD,4BAA4B,CAAC;AAQ/B,OAAO,MAAMI,sBAAsB,GAAGJ,iBAAiB,CAErD,2BAA2B,CAAC","ignoreList":[]}
@@ -1,9 +1,13 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { CreatePageRevisionFromUseCase as UseCaseAbstraction, CreatePageRevisionFromRepository } from "./abstractions.js";
3
+ import { GetPageByIdUseCase } from "../../../features/pages/GetPageById/index.js";
4
+ import { WbPermissions } from "../../../domain/permissions.js";
3
5
  declare class CreatePageRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private permissions;
4
7
  private eventPublisher;
8
+ private getPageById;
5
9
  private repository;
6
- constructor(eventPublisher: EventPublisherAbstraction.Interface, repository: CreatePageRevisionFromRepository.Interface);
10
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, getPageById: GetPageByIdUseCase.Interface, repository: CreatePageRevisionFromRepository.Interface);
7
11
  execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
8
12
  }
9
13
  export declare const CreatePageRevisionFromUseCase: typeof CreatePageRevisionFromUseCaseImpl & {
@@ -2,12 +2,28 @@ import { Result } from "@webiny/feature/api";
2
2
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
3
  import { CreatePageRevisionFromUseCase as UseCaseAbstraction, CreatePageRevisionFromRepository } from "./abstractions.js";
4
4
  import { PageBeforeCreateRevisionFromEvent, PageAfterCreateRevisionFromEvent } from "./events.js";
5
+ import { GetPageByIdUseCase } from "../GetPageById/index.js";
6
+ import { WbPermissions } from "../../../domain/permissions.js";
7
+ import { PageNotAuthorizedError } from "../../../domain/page/errors.js";
5
8
  class CreatePageRevisionFromUseCaseImpl {
6
- constructor(eventPublisher, repository) {
9
+ constructor(permissions, eventPublisher, getPageById, repository) {
10
+ this.permissions = permissions;
7
11
  this.eventPublisher = eventPublisher;
12
+ this.getPageById = getPageById;
8
13
  this.repository = repository;
9
14
  }
10
15
  async execute(params) {
16
+ const hasPermission = await this.permissions.canCreate("page");
17
+ if (!hasPermission) {
18
+ return Result.fail(new PageNotAuthorizedError());
19
+ }
20
+
21
+ // Verify ownership of the source page
22
+ const getResult = await this.getPageById.execute(params.id);
23
+ if (getResult.isFail()) {
24
+ return getResult;
25
+ }
26
+
11
27
  // Publish before event
12
28
  const beforeEvent = new PageBeforeCreateRevisionFromEvent({
13
29
  params
@@ -31,7 +47,7 @@ class CreatePageRevisionFromUseCaseImpl {
31
47
  }
32
48
  export const CreatePageRevisionFromUseCase = UseCaseAbstraction.createImplementation({
33
49
  implementation: CreatePageRevisionFromUseCaseImpl,
34
- dependencies: [EventPublisher, CreatePageRevisionFromRepository]
50
+ dependencies: [WbPermissions.Abstraction, EventPublisher, GetPageByIdUseCase, CreatePageRevisionFromRepository]
35
51
  });
36
52
 
37
53
  //# sourceMappingURL=CreatePageRevisionFromUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","EventPublisher","CreatePageRevisionFromUseCase","UseCaseAbstraction","CreatePageRevisionFromRepository","PageBeforeCreateRevisionFromEvent","PageAfterCreateRevisionFromEvent","CreatePageRevisionFromUseCaseImpl","constructor","eventPublisher","repository","execute","params","beforeEvent","publish","result","isFail","page","value","afterEvent","ok","createImplementation","implementation","dependencies"],"sources":["CreatePageRevisionFromUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n CreatePageRevisionFromUseCase as UseCaseAbstraction,\n CreatePageRevisionFromRepository\n} from \"./abstractions.js\";\nimport { PageBeforeCreateRevisionFromEvent, PageAfterCreateRevisionFromEvent } from \"./events.js\";\n\nclass CreatePageRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private eventPublisher: EventPublisherAbstraction.Interface,\n private repository: CreatePageRevisionFromRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n // Publish before event\n const beforeEvent = new PageBeforeCreateRevisionFromEvent({\n params\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the create revision operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n\n // Publish after event\n const afterEvent = new PageAfterCreateRevisionFromEvent({\n page\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok(page);\n }\n}\n\nexport const CreatePageRevisionFromUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreatePageRevisionFromUseCaseImpl,\n dependencies: [EventPublisher, CreatePageRevisionFromRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,6BAA6B,IAAIC,kBAAkB,EACnDC,gCAAgC;AAEpC,SAASC,iCAAiC,EAAEC,gCAAgC;AAE5E,MAAMC,iCAAiC,CAAyC;EAC5EC,WAAWA,CACCC,cAAmD,EACnDC,UAAsD,EAChE;IAAA,KAFUD,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,UAAsD,GAAtDA,UAAsD;EAC/D;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE;IACA,MAAMC,WAAW,GAAG,IAAIR,iCAAiC,CAAC;MACtDO;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACH,cAAc,CAACK,OAAO,CAACD,WAAW,CAAC;;IAE9C;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACL,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIG,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOD,MAAM;IACjB;IAEA,MAAME,IAAI,GAAGF,MAAM,CAACG,KAAK;;IAEzB;IACA,MAAMC,UAAU,GAAG,IAAIb,gCAAgC,CAAC;MACpDW;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACR,cAAc,CAACK,OAAO,CAACK,UAAU,CAAC;IAE7C,OAAOnB,MAAM,CAACoB,EAAE,CAACH,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMf,6BAA6B,GAAGC,kBAAkB,CAACkB,oBAAoB,CAAC;EACjFC,cAAc,EAAEf,iCAAiC;EACjDgB,YAAY,EAAE,CAACtB,cAAc,EAAEG,gCAAgC;AACnE,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","EventPublisher","CreatePageRevisionFromUseCase","UseCaseAbstraction","CreatePageRevisionFromRepository","PageBeforeCreateRevisionFromEvent","PageAfterCreateRevisionFromEvent","GetPageByIdUseCase","WbPermissions","PageNotAuthorizedError","CreatePageRevisionFromUseCaseImpl","constructor","permissions","eventPublisher","getPageById","repository","execute","params","hasPermission","canCreate","fail","getResult","id","isFail","beforeEvent","publish","result","page","value","afterEvent","ok","createImplementation","implementation","dependencies","Abstraction"],"sources":["CreatePageRevisionFromUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n CreatePageRevisionFromUseCase as UseCaseAbstraction,\n CreatePageRevisionFromRepository\n} from \"./abstractions.js\";\nimport { PageBeforeCreateRevisionFromEvent, PageAfterCreateRevisionFromEvent } from \"./events.js\";\nimport { GetPageByIdUseCase } from \"~/features/pages/GetPageById/index.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { PageNotAuthorizedError } from \"~/domain/page/errors.js\";\n\nclass CreatePageRevisionFromUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private getPageById: GetPageByIdUseCase.Interface,\n private repository: CreatePageRevisionFromRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canCreate(\"page\");\n if (!hasPermission) {\n return Result.fail(new PageNotAuthorizedError());\n }\n\n // Verify ownership of the source page\n const getResult = await this.getPageById.execute(params.id);\n if (getResult.isFail()) {\n return getResult;\n }\n\n // Publish before event\n const beforeEvent = new PageBeforeCreateRevisionFromEvent({\n params\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the create revision operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n\n // Publish after event\n const afterEvent = new PageAfterCreateRevisionFromEvent({\n page\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok(page);\n }\n}\n\nexport const CreatePageRevisionFromUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreatePageRevisionFromUseCaseImpl,\n dependencies: [\n WbPermissions.Abstraction,\n EventPublisher,\n GetPageByIdUseCase,\n CreatePageRevisionFromRepository\n ]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,6BAA6B,IAAIC,kBAAkB,EACnDC,gCAAgC;AAEpC,SAASC,iCAAiC,EAAEC,gCAAgC;AAC5E,SAASC,kBAAkB;AAC3B,SAASC,aAAa;AACtB,SAASC,sBAAsB;AAE/B,MAAMC,iCAAiC,CAAyC;EAC5EC,WAAWA,CACCC,WAAoC,EACpCC,cAAmD,EACnDC,WAAyC,EACzCC,UAAsD,EAChE;IAAA,KAJUH,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,WAAyC,GAAzCA,WAAyC;IAAA,KACzCC,UAAsD,GAAtDA,UAAsD;EAC/D;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACN,WAAW,CAACO,SAAS,CAAC,MAAM,CAAC;IAC9D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOlB,MAAM,CAACoB,IAAI,CAAC,IAAIX,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMY,SAAS,GAAG,MAAM,IAAI,CAACP,WAAW,CAACE,OAAO,CAACC,MAAM,CAACK,EAAE,CAAC;IAC3D,IAAID,SAAS,CAACE,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOF,SAAS;IACpB;;IAEA;IACA,MAAMG,WAAW,GAAG,IAAInB,iCAAiC,CAAC;MACtDY;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACJ,cAAc,CAACY,OAAO,CAACD,WAAW,CAAC;;IAE9C;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACX,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIS,MAAM,CAACH,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOG,MAAM;IACjB;IAEA,MAAMC,IAAI,GAAGD,MAAM,CAACE,KAAK;;IAEzB;IACA,MAAMC,UAAU,GAAG,IAAIvB,gCAAgC,CAAC;MACpDqB;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACd,cAAc,CAACY,OAAO,CAACI,UAAU,CAAC;IAE7C,OAAO7B,MAAM,CAAC8B,EAAE,CAACH,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMzB,6BAA6B,GAAGC,kBAAkB,CAAC4B,oBAAoB,CAAC;EACjFC,cAAc,EAAEtB,iCAAiC;EACjDuB,YAAY,EAAE,CACVzB,aAAa,CAAC0B,WAAW,EACzBjC,cAAc,EACdM,kBAAkB,EAClBH,gCAAgC;AAExC,CAAC,CAAC","ignoreList":[]}
@@ -2,7 +2,7 @@ import { type Result } from "@webiny/feature/api";
2
2
  import type { IEventHandler } from "@webiny/api-core/features/EventPublisher";
3
3
  import type { DomainEvent } from "@webiny/api-core/features/EventPublisher";
4
4
  import type { WbPage } from "../../../domain/page/abstractions.js";
5
- import { PageNotFoundError, PagePersistenceError, PageValidationError } from "../../../domain/page/errors.js";
5
+ import { PageNotFoundError, PagePersistenceError, PageValidationError, PageNotAuthorizedError } from "../../../domain/page/errors.js";
6
6
  export interface ICreateWbPageRevisionFromParams {
7
7
  id: string;
8
8
  }
@@ -26,6 +26,7 @@ export interface ICreatePageRevisionFromUseCase {
26
26
  execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, UseCaseError>>;
27
27
  }
28
28
  export interface ICreatePageRevisionFromUseCaseErrors {
29
+ notAuthorized: PageNotAuthorizedError;
29
30
  validation: PageValidationError;
30
31
  notFound: PageNotFoundError;
31
32
  persistence: PagePersistenceError;
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","CreatePageRevisionFromRepository","CreatePageRevisionFromUseCase","PageBeforeCreateRevisionFromHandler","PageAfterCreateRevisionFromHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport {\n PageNotFoundError,\n PagePersistenceError,\n PageValidationError\n} from \"~/domain/page/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface ICreateWbPageRevisionFromParams {\n id: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreatePageRevisionFromRepository {\n execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, RepositoryError>>;\n}\n\nexport interface ICreatePageRevisionFromRepositoryErrors {\n validation: PageValidationError;\n notFound: PageNotFoundError;\n persistence: PagePersistenceError;\n}\n\ntype RepositoryError =\n ICreatePageRevisionFromRepositoryErrors[keyof ICreatePageRevisionFromRepositoryErrors];\n\nexport const CreatePageRevisionFromRepository =\n createAbstraction<ICreatePageRevisionFromRepository>(\"Wb/CreatePageRevisionFromRepository\");\n\nexport namespace CreatePageRevisionFromRepository {\n export type Interface = ICreatePageRevisionFromRepository;\n export type Params = ICreateWbPageRevisionFromParams;\n export type Return = Promise<Result<WbPage, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreatePageRevisionFromUseCase {\n execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, UseCaseError>>;\n}\n\nexport interface ICreatePageRevisionFromUseCaseErrors {\n validation: PageValidationError;\n notFound: PageNotFoundError;\n persistence: PagePersistenceError;\n}\n\ntype UseCaseError =\n ICreatePageRevisionFromUseCaseErrors[keyof ICreatePageRevisionFromUseCaseErrors];\n\nexport const CreatePageRevisionFromUseCase = createAbstraction<ICreatePageRevisionFromUseCase>(\n \"Wb/CreatePageRevisionFromUseCase\"\n);\n\nexport namespace CreatePageRevisionFromUseCase {\n export type Interface = ICreatePageRevisionFromUseCase;\n export type Params = ICreateWbPageRevisionFromParams;\n export type Return = Promise<Result<WbPage, UseCaseError>>;\n export type Error = UseCaseError;\n export type Page = WbPage;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface PageBeforeCreateRevisionFromPayload {\n params: ICreateWbPageRevisionFromParams;\n}\n\nexport interface PageAfterCreateRevisionFromPayload {\n page: WbPage;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const PageBeforeCreateRevisionFromHandler = createAbstraction<\n IEventHandler<DomainEvent<PageBeforeCreateRevisionFromPayload>>\n>(\"Wb/PageBeforeCreateRevisionFromHandler\");\n\nexport namespace PageBeforeCreateRevisionFromHandler {\n export type Interface = IEventHandler<DomainEvent<PageBeforeCreateRevisionFromPayload>>;\n export type Event = DomainEvent<PageBeforeCreateRevisionFromPayload>;\n export type Page = WbPage;\n}\n\nexport const PageAfterCreateRevisionFromHandler = createAbstraction<\n IEventHandler<DomainEvent<PageAfterCreateRevisionFromPayload>>\n>(\"Wb/PageAfterCreateRevisionFromHandler\");\n\nexport namespace PageAfterCreateRevisionFromHandler {\n export type Interface = IEventHandler<DomainEvent<PageAfterCreateRevisionFromPayload>>;\n export type Event = DomainEvent<PageAfterCreateRevisionFromPayload>;\n export type Page = WbPage;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAUpE;AACA;AACA;;AAMA;AACA;AACA;;AAeA,OAAO,MAAMC,gCAAgC,GACzCD,iBAAiB,CAAoC,qCAAqC,CAAC;;AAS/F;AACA;AACA;;AAeA,OAAO,MAAME,6BAA6B,GAAGF,iBAAiB,CAC1D,kCACJ,CAAC;;AAUD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,mCAAmC,GAAGH,iBAAiB,CAElE,wCAAwC,CAAC;AAQ3C,OAAO,MAAMI,kCAAkC,GAAGJ,iBAAiB,CAEjE,uCAAuC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","CreatePageRevisionFromRepository","CreatePageRevisionFromUseCase","PageBeforeCreateRevisionFromHandler","PageAfterCreateRevisionFromHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { IEventHandler } from \"@webiny/api-core/features/EventPublisher\";\nimport type { DomainEvent } from \"@webiny/api-core/features/EventPublisher\";\nimport type { WbPage } from \"~/domain/page/abstractions.js\";\nimport {\n PageNotFoundError,\n PagePersistenceError,\n PageValidationError,\n PageNotAuthorizedError\n} from \"~/domain/page/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface ICreateWbPageRevisionFromParams {\n id: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreatePageRevisionFromRepository {\n execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, RepositoryError>>;\n}\n\nexport interface ICreatePageRevisionFromRepositoryErrors {\n validation: PageValidationError;\n notFound: PageNotFoundError;\n persistence: PagePersistenceError;\n}\n\ntype RepositoryError =\n ICreatePageRevisionFromRepositoryErrors[keyof ICreatePageRevisionFromRepositoryErrors];\n\nexport const CreatePageRevisionFromRepository =\n createAbstraction<ICreatePageRevisionFromRepository>(\"Wb/CreatePageRevisionFromRepository\");\n\nexport namespace CreatePageRevisionFromRepository {\n export type Interface = ICreatePageRevisionFromRepository;\n export type Params = ICreateWbPageRevisionFromParams;\n export type Return = Promise<Result<WbPage, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreatePageRevisionFromUseCase {\n execute(params: ICreateWbPageRevisionFromParams): Promise<Result<WbPage, UseCaseError>>;\n}\n\nexport interface ICreatePageRevisionFromUseCaseErrors {\n notAuthorized: PageNotAuthorizedError;\n validation: PageValidationError;\n notFound: PageNotFoundError;\n persistence: PagePersistenceError;\n}\n\ntype UseCaseError =\n ICreatePageRevisionFromUseCaseErrors[keyof ICreatePageRevisionFromUseCaseErrors];\n\nexport const CreatePageRevisionFromUseCase = createAbstraction<ICreatePageRevisionFromUseCase>(\n \"Wb/CreatePageRevisionFromUseCase\"\n);\n\nexport namespace CreatePageRevisionFromUseCase {\n export type Interface = ICreatePageRevisionFromUseCase;\n export type Params = ICreateWbPageRevisionFromParams;\n export type Return = Promise<Result<WbPage, UseCaseError>>;\n export type Error = UseCaseError;\n export type Page = WbPage;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface PageBeforeCreateRevisionFromPayload {\n params: ICreateWbPageRevisionFromParams;\n}\n\nexport interface PageAfterCreateRevisionFromPayload {\n page: WbPage;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const PageBeforeCreateRevisionFromHandler = createAbstraction<\n IEventHandler<DomainEvent<PageBeforeCreateRevisionFromPayload>>\n>(\"Wb/PageBeforeCreateRevisionFromHandler\");\n\nexport namespace PageBeforeCreateRevisionFromHandler {\n export type Interface = IEventHandler<DomainEvent<PageBeforeCreateRevisionFromPayload>>;\n export type Event = DomainEvent<PageBeforeCreateRevisionFromPayload>;\n export type Page = WbPage;\n}\n\nexport const PageAfterCreateRevisionFromHandler = createAbstraction<\n IEventHandler<DomainEvent<PageAfterCreateRevisionFromPayload>>\n>(\"Wb/PageAfterCreateRevisionFromHandler\");\n\nexport namespace PageAfterCreateRevisionFromHandler {\n export type Interface = IEventHandler<DomainEvent<PageAfterCreateRevisionFromPayload>>;\n export type Event = DomainEvent<PageAfterCreateRevisionFromPayload>;\n export type Page = WbPage;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAWpE;AACA;AACA;;AAMA;AACA;AACA;;AAeA,OAAO,MAAMC,gCAAgC,GACzCD,iBAAiB,CAAoC,qCAAqC,CAAC;;AAS/F;AACA;AACA;;AAgBA,OAAO,MAAME,6BAA6B,GAAGF,iBAAiB,CAC1D,kCACJ,CAAC;;AAUD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,mCAAmC,GAAGH,iBAAiB,CAElE,wCAAwC,CAAC;AAQ3C,OAAO,MAAMI,kCAAkC,GAAGJ,iBAAiB,CAEjE,uCAAuC,CAAC","ignoreList":[]}
@@ -1,11 +1,13 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { DeletePageUseCase as UseCaseAbstraction, DeletePageRepository } from "./abstractions.js";
3
3
  import { GetPageByIdUseCase } from "../../../features/pages/GetPageById/index.js";
4
+ import { WbPermissions } from "../../../domain/permissions.js";
4
5
  declare class DeletePageUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private permissions;
5
7
  private eventPublisher;
6
8
  private getPageById;
7
9
  private repository;
8
- constructor(eventPublisher: EventPublisherAbstraction.Interface, getPageById: GetPageByIdUseCase.Interface, repository: DeletePageRepository.Interface);
10
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, getPageById: GetPageByIdUseCase.Interface, repository: DeletePageRepository.Interface);
9
11
  execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
10
12
  }
11
13
  export declare const DeletePageUseCase: typeof DeletePageUseCaseImpl & {
@@ -3,19 +3,26 @@ import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
3
  import { DeletePageUseCase as UseCaseAbstraction, DeletePageRepository } from "./abstractions.js";
4
4
  import { PageBeforeDeleteEvent, PageAfterDeleteEvent } from "./events.js";
5
5
  import { GetPageByIdUseCase } from "../GetPageById/index.js";
6
+ import { WbPermissions } from "../../../domain/permissions.js";
7
+ import { PageNotAuthorizedError } from "../../../domain/page/errors.js";
6
8
  class DeletePageUseCaseImpl {
7
- constructor(eventPublisher, getPageById, repository) {
9
+ constructor(permissions, eventPublisher, getPageById, repository) {
10
+ this.permissions = permissions;
8
11
  this.eventPublisher = eventPublisher;
9
12
  this.getPageById = getPageById;
10
13
  this.repository = repository;
11
14
  }
12
15
  async execute(params) {
13
- // Get the page first to include in events
16
+ // Get the page first to include in events and for item-level permission check
14
17
  const getResult = await this.getPageById.execute(params.id);
15
18
  if (getResult.isFail()) {
16
19
  return Result.fail(getResult.error);
17
20
  }
18
21
  const page = getResult.value;
22
+ const canDelete = await this.permissions.canDelete("page", page);
23
+ if (!canDelete) {
24
+ return Result.fail(new PageNotAuthorizedError());
25
+ }
19
26
 
20
27
  // Publish before delete event
21
28
  const beforeEvent = new PageBeforeDeleteEvent({
@@ -39,7 +46,7 @@ class DeletePageUseCaseImpl {
39
46
  }
40
47
  export const DeletePageUseCase = UseCaseAbstraction.createImplementation({
41
48
  implementation: DeletePageUseCaseImpl,
42
- dependencies: [EventPublisher, GetPageByIdUseCase, DeletePageRepository]
49
+ dependencies: [WbPermissions.Abstraction, EventPublisher, GetPageByIdUseCase, DeletePageRepository]
43
50
  });
44
51
 
45
52
  //# sourceMappingURL=DeletePageUseCase.js.map