@webiny/api-website-builder 0.0.0-unstable.df7a8bb475 → 0.0.0-unstable.e2758ee1cf

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 (121) 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 +125 -0
  6. package/domain/permissions.js +33 -0
  7. package/domain/permissions.js.map +1 -0
  8. package/features/installer/ApiKeyInstaller.js +4 -1
  9. package/features/installer/ApiKeyInstaller.js.map +1 -1
  10. package/features/pages/CreatePage/CreatePageUseCase.d.ts +3 -1
  11. package/features/pages/CreatePage/CreatePageUseCase.js +10 -2
  12. package/features/pages/CreatePage/CreatePageUseCase.js.map +1 -1
  13. package/features/pages/CreatePage/abstractions.d.ts +2 -1
  14. package/features/pages/CreatePage/abstractions.js.map +1 -1
  15. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.d.ts +5 -1
  16. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js +18 -2
  17. package/features/pages/CreatePageRevisionFrom/CreatePageRevisionFromUseCase.js.map +1 -1
  18. package/features/pages/CreatePageRevisionFrom/abstractions.d.ts +2 -1
  19. package/features/pages/CreatePageRevisionFrom/abstractions.js.map +1 -1
  20. package/features/pages/DeletePage/DeletePageUseCase.d.ts +3 -1
  21. package/features/pages/DeletePage/DeletePageUseCase.js +10 -3
  22. package/features/pages/DeletePage/DeletePageUseCase.js.map +1 -1
  23. package/features/pages/DeletePage/abstractions.d.ts +2 -1
  24. package/features/pages/DeletePage/abstractions.js.map +1 -1
  25. package/features/pages/DuplicatePage/DuplicatePageUseCase.d.ts +3 -1
  26. package/features/pages/DuplicatePage/DuplicatePageUseCase.js +10 -2
  27. package/features/pages/DuplicatePage/DuplicatePageUseCase.js.map +1 -1
  28. package/features/pages/DuplicatePage/abstractions.d.ts +2 -1
  29. package/features/pages/DuplicatePage/abstractions.js.map +1 -1
  30. package/features/pages/GetPageById/GetPageByIdUseCase.d.ts +3 -1
  31. package/features/pages/GetPageById/GetPageByIdUseCase.js +19 -3
  32. package/features/pages/GetPageById/GetPageByIdUseCase.js.map +1 -1
  33. package/features/pages/GetPageById/abstractions.d.ts +2 -1
  34. package/features/pages/GetPageById/abstractions.js.map +1 -1
  35. package/features/pages/GetPageByPath/GetPageByPathUseCase.d.ts +3 -1
  36. package/features/pages/GetPageByPath/GetPageByPathUseCase.js +19 -3
  37. package/features/pages/GetPageByPath/GetPageByPathUseCase.js.map +1 -1
  38. package/features/pages/GetPageByPath/abstractions.d.ts +2 -1
  39. package/features/pages/GetPageByPath/abstractions.js.map +1 -1
  40. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.d.ts +3 -1
  41. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js +22 -3
  42. package/features/pages/GetPageRevisions/GetPageRevisionsUseCase.js.map +1 -1
  43. package/features/pages/GetPageRevisions/abstractions.d.ts +2 -1
  44. package/features/pages/GetPageRevisions/abstractions.js.map +1 -1
  45. package/features/pages/ListPages/ListPagesRepository.d.ts +5 -1
  46. package/features/pages/ListPages/ListPagesRepository.js +14 -4
  47. package/features/pages/ListPages/ListPagesRepository.js.map +1 -1
  48. package/features/pages/ListPages/ListPagesUseCase.d.ts +5 -1
  49. package/features/pages/ListPages/ListPagesUseCase.js +24 -4
  50. package/features/pages/ListPages/ListPagesUseCase.js.map +1 -1
  51. package/features/pages/ListPages/abstractions.d.ts +2 -1
  52. package/features/pages/ListPages/abstractions.js.map +1 -1
  53. package/features/pages/MovePage/MovePageUseCase.d.ts +3 -1
  54. package/features/pages/MovePage/MovePageUseCase.js +14 -2
  55. package/features/pages/MovePage/MovePageUseCase.js.map +1 -1
  56. package/features/pages/MovePage/abstractions.d.ts +2 -1
  57. package/features/pages/MovePage/abstractions.js.map +1 -1
  58. package/features/pages/PublishPage/PublishPageUseCase.d.ts +3 -1
  59. package/features/pages/PublishPage/PublishPageUseCase.js +14 -2
  60. package/features/pages/PublishPage/PublishPageUseCase.js.map +1 -1
  61. package/features/pages/PublishPage/abstractions.d.ts +2 -1
  62. package/features/pages/PublishPage/abstractions.js.map +1 -1
  63. package/features/pages/UnpublishPage/UnpublishPageUseCase.d.ts +3 -1
  64. package/features/pages/UnpublishPage/UnpublishPageUseCase.js +14 -2
  65. package/features/pages/UnpublishPage/UnpublishPageUseCase.js.map +1 -1
  66. package/features/pages/UnpublishPage/abstractions.d.ts +2 -1
  67. package/features/pages/UnpublishPage/abstractions.js.map +1 -1
  68. package/features/pages/UpdatePage/UpdatePageUseCase.d.ts +3 -1
  69. package/features/pages/UpdatePage/UpdatePageUseCase.js +14 -2
  70. package/features/pages/UpdatePage/UpdatePageUseCase.js.map +1 -1
  71. package/features/pages/UpdatePage/abstractions.d.ts +5 -5
  72. package/features/pages/UpdatePage/abstractions.js.map +1 -1
  73. package/features/redirects/CreateRedirect/CreateRedirectUseCase.d.ts +3 -1
  74. package/features/redirects/CreateRedirect/CreateRedirectUseCase.js +10 -2
  75. package/features/redirects/CreateRedirect/CreateRedirectUseCase.js.map +1 -1
  76. package/features/redirects/CreateRedirect/abstractions.d.ts +2 -1
  77. package/features/redirects/CreateRedirect/abstractions.js.map +1 -1
  78. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.d.ts +3 -1
  79. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js +10 -3
  80. package/features/redirects/DeleteRedirect/DeleteRedirectUseCase.js.map +1 -1
  81. package/features/redirects/DeleteRedirect/abstractions.d.ts +2 -1
  82. package/features/redirects/DeleteRedirect/abstractions.js.map +1 -1
  83. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.d.ts +3 -1
  84. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js +10 -3
  85. package/features/redirects/GetActiveRedirects/GetActiveRedirectsUseCase.js.map +1 -1
  86. package/features/redirects/GetActiveRedirects/abstractions.d.ts +2 -1
  87. package/features/redirects/GetActiveRedirects/abstractions.js.map +1 -1
  88. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.d.ts +3 -1
  89. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js +19 -4
  90. package/features/redirects/GetRedirectById/GetRedirectByIdUseCase.js.map +1 -1
  91. package/features/redirects/GetRedirectById/abstractions.d.ts +2 -1
  92. package/features/redirects/GetRedirectById/abstractions.js.map +1 -1
  93. package/features/redirects/ListRedirects/ListRedirectsUseCase.d.ts +5 -1
  94. package/features/redirects/ListRedirects/ListRedirectsUseCase.js +23 -4
  95. package/features/redirects/ListRedirects/ListRedirectsUseCase.js.map +1 -1
  96. package/features/redirects/ListRedirects/abstractions.d.ts +3 -1
  97. package/features/redirects/ListRedirects/abstractions.js.map +1 -1
  98. package/features/redirects/MoveRedirect/MoveRedirectUseCase.d.ts +3 -1
  99. package/features/redirects/MoveRedirect/MoveRedirectUseCase.js +14 -2
  100. package/features/redirects/MoveRedirect/MoveRedirectUseCase.js.map +1 -1
  101. package/features/redirects/MoveRedirect/abstractions.d.ts +2 -1
  102. package/features/redirects/MoveRedirect/abstractions.js.map +1 -1
  103. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.d.ts +3 -1
  104. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js +14 -2
  105. package/features/redirects/UpdateRedirect/UpdateRedirectUseCase.js.map +1 -1
  106. package/features/redirects/UpdateRedirect/abstractions.d.ts +2 -1
  107. package/features/redirects/UpdateRedirect/abstractions.js.map +1 -1
  108. package/features/tenantManager/TenantModelExtension.js +5 -5
  109. package/features/tenantManager/TenantModelExtension.js.map +1 -1
  110. package/graphql/pages/pages.typeDefs.d.ts +1 -1
  111. package/graphql/pages/pages.typeDefs.js +6 -0
  112. package/graphql/pages/pages.typeDefs.js.map +1 -1
  113. package/index.js +4 -4
  114. package/index.js.map +1 -1
  115. package/package.json +19 -20
  116. package/features/pages/PagePermissions/feature.d.ts +0 -1
  117. package/features/pages/PagePermissions/feature.js +0 -53
  118. package/features/pages/PagePermissions/feature.js.map +0 -1
  119. package/features/redirects/RedirectPermissions/feature.d.ts +0 -1
  120. package/features/redirects/RedirectPermissions/feature.js +0 -45
  121. package/features/redirects/RedirectPermissions/feature.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","CreateRedirectRepository","CreateRedirectUseCase","RedirectBeforeCreateHandler","RedirectAfterCreateHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport { RedirectPersistenceError, RedirectValidationError } from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport type ICreateWbRedirectData = Pick<\n WbRedirect,\n \"redirectFrom\" | \"redirectTo\" | \"redirectType\" | \"isEnabled\" | \"location\"\n>;\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreateRedirectRepository {\n execute(data: ICreateWbRedirectData): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface ICreateRedirectRepositoryErrors {\n validation: RedirectValidationError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = ICreateRedirectRepositoryErrors[keyof ICreateRedirectRepositoryErrors];\n\nexport const CreateRedirectRepository = createAbstraction<ICreateRedirectRepository>(\n \"Wb/CreateRedirectRepository\"\n);\n\nexport namespace CreateRedirectRepository {\n export type Interface = ICreateRedirectRepository;\n export type Params = ICreateWbRedirectData;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreateRedirectUseCase {\n execute(data: ICreateWbRedirectData): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface ICreateRedirectUseCaseErrors {\n validation: RedirectValidationError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = ICreateRedirectUseCaseErrors[keyof ICreateRedirectUseCaseErrors];\n\nexport const CreateRedirectUseCase = createAbstraction<ICreateRedirectUseCase>(\n \"Wb/CreateRedirectUseCase\"\n);\n\nexport namespace CreateRedirectUseCase {\n export type Interface = ICreateRedirectUseCase;\n export type Params = ICreateWbRedirectData;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeCreatePayload {\n input: ICreateWbRedirectData;\n}\n\nexport interface RedirectAfterCreatePayload {\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeCreatePayload>>\n>(\"Wb/RedirectBeforeCreateHandler\");\n\nexport namespace RedirectBeforeCreateHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeCreatePayload>>;\n export type Event = DomainEvent<RedirectBeforeCreatePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterCreatePayload>>\n>(\"Wb/RedirectAfterCreateHandler\");\n\nexport namespace RedirectAfterCreateHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterCreatePayload>>;\n export type Event = DomainEvent<RedirectAfterCreatePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAMpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,wBAAwB,GAAGD,iBAAiB,CACrD,6BACJ,CAAC;;AAUD;AACA;AACA;;AAaA,OAAO,MAAME,qBAAqB,GAAGF,iBAAiB,CAClD,0BACJ,CAAC;;AAUD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,2BAA2B,GAAGH,iBAAiB,CAE1D,gCAAgC,CAAC;AAQnC,OAAO,MAAMI,0BAA0B,GAAGJ,iBAAiB,CAEzD,+BAA+B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","CreateRedirectRepository","CreateRedirectUseCase","RedirectBeforeCreateHandler","RedirectAfterCreateHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport {\n RedirectPersistenceError,\n RedirectValidationError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport type ICreateWbRedirectData = Pick<\n WbRedirect,\n \"redirectFrom\" | \"redirectTo\" | \"redirectType\" | \"isEnabled\" | \"location\"\n>;\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface ICreateRedirectRepository {\n execute(data: ICreateWbRedirectData): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface ICreateRedirectRepositoryErrors {\n validation: RedirectValidationError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = ICreateRedirectRepositoryErrors[keyof ICreateRedirectRepositoryErrors];\n\nexport const CreateRedirectRepository = createAbstraction<ICreateRedirectRepository>(\n \"Wb/CreateRedirectRepository\"\n);\n\nexport namespace CreateRedirectRepository {\n export type Interface = ICreateRedirectRepository;\n export type Params = ICreateWbRedirectData;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface ICreateRedirectUseCase {\n execute(data: ICreateWbRedirectData): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface ICreateRedirectUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n validation: RedirectValidationError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = ICreateRedirectUseCaseErrors[keyof ICreateRedirectUseCaseErrors];\n\nexport const CreateRedirectUseCase = createAbstraction<ICreateRedirectUseCase>(\n \"Wb/CreateRedirectUseCase\"\n);\n\nexport namespace CreateRedirectUseCase {\n export type Interface = ICreateRedirectUseCase;\n export type Params = ICreateWbRedirectData;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeCreatePayload {\n input: ICreateWbRedirectData;\n}\n\nexport interface RedirectAfterCreatePayload {\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeCreatePayload>>\n>(\"Wb/RedirectBeforeCreateHandler\");\n\nexport namespace RedirectBeforeCreateHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeCreatePayload>>;\n export type Event = DomainEvent<RedirectBeforeCreatePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterCreateHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterCreatePayload>>\n>(\"Wb/RedirectAfterCreateHandler\");\n\nexport namespace RedirectAfterCreateHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterCreatePayload>>;\n export type Event = DomainEvent<RedirectAfterCreatePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAUpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,wBAAwB,GAAGD,iBAAiB,CACrD,6BACJ,CAAC;;AAUD;AACA;AACA;;AAcA,OAAO,MAAME,qBAAqB,GAAGF,iBAAiB,CAClD,0BACJ,CAAC;;AAUD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,2BAA2B,GAAGH,iBAAiB,CAE1D,gCAAgC,CAAC;AAQnC,OAAO,MAAMI,0BAA0B,GAAGJ,iBAAiB,CAEzD,+BAA+B,CAAC","ignoreList":[]}
@@ -1,11 +1,13 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { DeleteRedirectUseCase as UseCaseAbstraction, DeleteRedirectRepository } from "./abstractions.js";
3
3
  import { GetRedirectByIdUseCase } from "../../../features/redirects/GetRedirectById/index.js";
4
+ import { WbPermissions } from "../../../domain/permissions.js";
4
5
  declare class DeleteRedirectUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private permissions;
5
7
  private eventPublisher;
6
8
  private getRedirectById;
7
9
  private repository;
8
- constructor(eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: DeleteRedirectRepository.Interface);
10
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: DeleteRedirectRepository.Interface);
9
11
  execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
10
12
  }
11
13
  export declare const DeleteRedirectUseCase: import("@webiny/di").Implementation<typeof DeleteRedirectUseCaseImpl>;
@@ -3,19 +3,26 @@ import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
3
  import { DeleteRedirectUseCase as UseCaseAbstraction, DeleteRedirectRepository } from "./abstractions.js";
4
4
  import { RedirectBeforeDeleteEvent, RedirectAfterDeleteEvent } from "./events.js";
5
5
  import { GetRedirectByIdUseCase } from "../GetRedirectById/index.js";
6
+ import { WbPermissions } from "../../../domain/permissions.js";
7
+ import { RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
6
8
  class DeleteRedirectUseCaseImpl {
7
- constructor(eventPublisher, getRedirectById, repository) {
9
+ constructor(permissions, eventPublisher, getRedirectById, repository) {
10
+ this.permissions = permissions;
8
11
  this.eventPublisher = eventPublisher;
9
12
  this.getRedirectById = getRedirectById;
10
13
  this.repository = repository;
11
14
  }
12
15
  async execute(params) {
13
- // Get the redirect first to include in events
16
+ // Get the redirect first to include in events and for item-level permission check
14
17
  const getResult = await this.getRedirectById.execute(params.id);
15
18
  if (getResult.isFail()) {
16
19
  return Result.fail(getResult.error);
17
20
  }
18
21
  const redirect = getResult.value;
22
+ const canDelete = await this.permissions.canDelete("redirect", redirect);
23
+ if (!canDelete) {
24
+ return Result.fail(new RedirectNotAuthorizedError());
25
+ }
19
26
 
20
27
  // Publish before delete event
21
28
  const beforeEvent = new RedirectBeforeDeleteEvent({
@@ -40,7 +47,7 @@ class DeleteRedirectUseCaseImpl {
40
47
  export const DeleteRedirectUseCase = createImplementation({
41
48
  abstraction: UseCaseAbstraction,
42
49
  implementation: DeleteRedirectUseCaseImpl,
43
- dependencies: [EventPublisher, GetRedirectByIdUseCase, DeleteRedirectRepository]
50
+ dependencies: [WbPermissions.Abstraction, EventPublisher, GetRedirectByIdUseCase, DeleteRedirectRepository]
44
51
  });
45
52
 
46
53
  //# sourceMappingURL=DeleteRedirectUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","EventPublisher","DeleteRedirectUseCase","UseCaseAbstraction","DeleteRedirectRepository","RedirectBeforeDeleteEvent","RedirectAfterDeleteEvent","GetRedirectByIdUseCase","DeleteRedirectUseCaseImpl","constructor","eventPublisher","getRedirectById","repository","execute","params","getResult","id","isFail","fail","error","redirect","value","beforeEvent","publish","result","afterEvent","ok","abstraction","implementation","dependencies"],"sources":["DeleteRedirectUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n DeleteRedirectUseCase as UseCaseAbstraction,\n DeleteRedirectRepository\n} from \"./abstractions.js\";\nimport { RedirectBeforeDeleteEvent, RedirectAfterDeleteEvent } from \"./events.js\";\nimport { GetRedirectByIdUseCase } from \"~/features/redirects/GetRedirectById/index.js\";\n\nclass DeleteRedirectUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private eventPublisher: EventPublisherAbstraction.Interface,\n private getRedirectById: GetRedirectByIdUseCase.Interface,\n private repository: DeleteRedirectRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n // Get the redirect first to include in events\n const getResult = await this.getRedirectById.execute(params.id);\n\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const redirect = getResult.value;\n\n // Publish before delete event\n const beforeEvent = new RedirectBeforeDeleteEvent({\n redirect\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the delete operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n // Publish after delete event\n const afterEvent = new RedirectAfterDeleteEvent({\n redirect\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok();\n }\n}\n\nexport const DeleteRedirectUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: DeleteRedirectUseCaseImpl,\n dependencies: [EventPublisher, GetRedirectByIdUseCase, DeleteRedirectRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,qBAAqB,IAAIC,kBAAkB,EAC3CC,wBAAwB;AAE5B,SAASC,yBAAyB,EAAEC,wBAAwB;AAC5D,SAASC,sBAAsB;AAE/B,MAAMC,yBAAyB,CAAyC;EACpEC,WAAWA,CACCC,cAAmD,EACnDC,eAAiD,EACjDC,UAA8C,EACxD;IAAA,KAHUF,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAAiD,GAAjDA,eAAiD;IAAA,KACjDC,UAA8C,GAA9CA,UAA8C;EACvD;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACE,OAAO,CAACC,MAAM,CAACE,EAAE,CAAC;IAE/D,IAAID,SAAS,CAACE,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOlB,MAAM,CAACmB,IAAI,CAACH,SAAS,CAACI,KAAK,CAAC;IACvC;IAEA,MAAMC,QAAQ,GAAGL,SAAS,CAACM,KAAK;;IAEhC;IACA,MAAMC,WAAW,GAAG,IAAIjB,yBAAyB,CAAC;MAC9Ce;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACV,cAAc,CAACa,OAAO,CAACD,WAAW,CAAC;;IAE9C;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACZ,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIU,MAAM,CAACP,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOO,MAAM;IACjB;;IAEA;IACA,MAAMC,UAAU,GAAG,IAAInB,wBAAwB,CAAC;MAC5Cc;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACV,cAAc,CAACa,OAAO,CAACE,UAAU,CAAC;IAE7C,OAAO1B,MAAM,CAAC2B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAMxB,qBAAqB,GAAGF,oBAAoB,CAAC;EACtD2B,WAAW,EAAExB,kBAAkB;EAC/ByB,cAAc,EAAEpB,yBAAyB;EACzCqB,YAAY,EAAE,CAAC5B,cAAc,EAAEM,sBAAsB,EAAEH,wBAAwB;AACnF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","EventPublisher","DeleteRedirectUseCase","UseCaseAbstraction","DeleteRedirectRepository","RedirectBeforeDeleteEvent","RedirectAfterDeleteEvent","GetRedirectByIdUseCase","WbPermissions","RedirectNotAuthorizedError","DeleteRedirectUseCaseImpl","constructor","permissions","eventPublisher","getRedirectById","repository","execute","params","getResult","id","isFail","fail","error","redirect","value","canDelete","beforeEvent","publish","result","afterEvent","ok","abstraction","implementation","dependencies","Abstraction"],"sources":["DeleteRedirectUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n DeleteRedirectUseCase as UseCaseAbstraction,\n DeleteRedirectRepository\n} from \"./abstractions.js\";\nimport { RedirectBeforeDeleteEvent, RedirectAfterDeleteEvent } from \"./events.js\";\nimport { GetRedirectByIdUseCase } from \"~/features/redirects/GetRedirectById/index.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { RedirectNotAuthorizedError } from \"~/domain/redirect/errors.js\";\n\nclass DeleteRedirectUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private getRedirectById: GetRedirectByIdUseCase.Interface,\n private repository: DeleteRedirectRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n // Get the redirect first to include in events and for item-level permission check\n const getResult = await this.getRedirectById.execute(params.id);\n\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const redirect = getResult.value;\n\n const canDelete = await this.permissions.canDelete(\"redirect\", redirect);\n if (!canDelete) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n // Publish before delete event\n const beforeEvent = new RedirectBeforeDeleteEvent({\n redirect\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the delete operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n // Publish after delete event\n const afterEvent = new RedirectAfterDeleteEvent({\n redirect\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok();\n }\n}\n\nexport const DeleteRedirectUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: DeleteRedirectUseCaseImpl,\n dependencies: [\n WbPermissions.Abstraction,\n EventPublisher,\n GetRedirectByIdUseCase,\n DeleteRedirectRepository\n ]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,qBAAqB,IAAIC,kBAAkB,EAC3CC,wBAAwB;AAE5B,SAASC,yBAAyB,EAAEC,wBAAwB;AAC5D,SAASC,sBAAsB;AAC/B,SAASC,aAAa;AACtB,SAASC,0BAA0B;AAEnC,MAAMC,yBAAyB,CAAyC;EACpEC,WAAWA,CACCC,WAAoC,EACpCC,cAAmD,EACnDC,eAAiD,EACjDC,UAA8C,EACxD;IAAA,KAJUH,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAAiD,GAAjDA,eAAiD;IAAA,KACjDC,UAA8C,GAA9CA,UAA8C;EACvD;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACE,OAAO,CAACC,MAAM,CAACE,EAAE,CAAC;IAE/D,IAAID,SAAS,CAACE,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOrB,MAAM,CAACsB,IAAI,CAACH,SAAS,CAACI,KAAK,CAAC;IACvC;IAEA,MAAMC,QAAQ,GAAGL,SAAS,CAACM,KAAK;IAEhC,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACb,WAAW,CAACa,SAAS,CAAC,UAAU,EAAEF,QAAQ,CAAC;IACxE,IAAI,CAACE,SAAS,EAAE;MACZ,OAAO1B,MAAM,CAACsB,IAAI,CAAC,IAAIZ,0BAA0B,CAAC,CAAC,CAAC;IACxD;;IAEA;IACA,MAAMiB,WAAW,GAAG,IAAIrB,yBAAyB,CAAC;MAC9CkB;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACV,cAAc,CAACc,OAAO,CAACD,WAAW,CAAC;;IAE9C;IACA,MAAME,MAAM,GAAG,MAAM,IAAI,CAACb,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIW,MAAM,CAACR,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOQ,MAAM;IACjB;;IAEA;IACA,MAAMC,UAAU,GAAG,IAAIvB,wBAAwB,CAAC;MAC5CiB;IACJ,CAAC,CAAC;IAEF,MAAM,IAAI,CAACV,cAAc,CAACc,OAAO,CAACE,UAAU,CAAC;IAE7C,OAAO9B,MAAM,CAAC+B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAM5B,qBAAqB,GAAGF,oBAAoB,CAAC;EACtD+B,WAAW,EAAE5B,kBAAkB;EAC/B6B,cAAc,EAAEtB,yBAAyB;EACzCuB,YAAY,EAAE,CACVzB,aAAa,CAAC0B,WAAW,EACzBjC,cAAc,EACdM,sBAAsB,EACtBH,wBAAwB;AAEhC,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 { WbRedirect } from "../../../domain/redirect/abstractions.js";
5
- import { RedirectNotFoundError, RedirectPersistenceError } from "../../../domain/redirect/errors.js";
5
+ import { RedirectNotFoundError, RedirectPersistenceError, RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
6
6
  export interface IDeleteWbRedirectParams {
7
7
  id: string;
8
8
  }
@@ -25,6 +25,7 @@ export interface IDeleteRedirectUseCase {
25
25
  execute(params: IDeleteWbRedirectParams): Promise<Result<void, UseCaseError>>;
26
26
  }
27
27
  export interface IDeleteRedirectUseCaseErrors {
28
+ notAuthorized: RedirectNotAuthorizedError;
28
29
  notFound: RedirectNotFoundError;
29
30
  persistence: RedirectPersistenceError;
30
31
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","DeleteRedirectRepository","DeleteRedirectUseCase","RedirectBeforeDeleteHandler","RedirectAfterDeleteHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport { RedirectNotFoundError, RedirectPersistenceError } from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IDeleteWbRedirectParams {\n id: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IDeleteRedirectRepository {\n execute(params: IDeleteWbRedirectParams): Promise<Result<void, RepositoryError>>;\n}\n\nexport interface IDeleteRedirectRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IDeleteRedirectRepositoryErrors[keyof IDeleteRedirectRepositoryErrors];\n\nexport const DeleteRedirectRepository = createAbstraction<IDeleteRedirectRepository>(\n \"Wb/DeleteRedirectRepository\"\n);\n\nexport namespace DeleteRedirectRepository {\n export type Interface = IDeleteRedirectRepository;\n export type Params = IDeleteWbRedirectParams;\n export type Return = Promise<Result<void, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IDeleteRedirectUseCase {\n execute(params: IDeleteWbRedirectParams): Promise<Result<void, UseCaseError>>;\n}\n\nexport interface IDeleteRedirectUseCaseErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IDeleteRedirectUseCaseErrors[keyof IDeleteRedirectUseCaseErrors];\n\nexport const DeleteRedirectUseCase = createAbstraction<IDeleteRedirectUseCase>(\n \"Wb/DeleteRedirectUseCase\"\n);\n\nexport namespace DeleteRedirectUseCase {\n export type Interface = IDeleteRedirectUseCase;\n export type Params = IDeleteWbRedirectParams;\n export type Return = Promise<Result<void, UseCaseError>>;\n export type Error = UseCaseError;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeDeletePayload {\n redirect: WbRedirect;\n}\n\nexport interface RedirectAfterDeletePayload {\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeDeleteHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeDeletePayload>>\n>(\"Wb/RedirectBeforeDeleteHandler\");\n\nexport namespace RedirectBeforeDeleteHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeDeletePayload>>;\n export type Event = DomainEvent<RedirectBeforeDeletePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterDeleteHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterDeletePayload>>\n>(\"Wb/RedirectAfterDeleteHandler\");\n\nexport namespace RedirectAfterDeleteHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterDeletePayload>>;\n export type Event = DomainEvent<RedirectAfterDeletePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAMpE;AACA;AACA;;AAMA;AACA;AACA;;AAaA,OAAO,MAAMC,wBAAwB,GAAGD,iBAAiB,CACrD,6BACJ,CAAC;;AASD;AACA;AACA;;AAaA,OAAO,MAAME,qBAAqB,GAAGF,iBAAiB,CAClD,0BACJ,CAAC;;AASD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,2BAA2B,GAAGH,iBAAiB,CAE1D,gCAAgC,CAAC;AAQnC,OAAO,MAAMI,0BAA0B,GAAGJ,iBAAiB,CAEzD,+BAA+B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","DeleteRedirectRepository","DeleteRedirectUseCase","RedirectBeforeDeleteHandler","RedirectAfterDeleteHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport {\n RedirectNotFoundError,\n RedirectPersistenceError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IDeleteWbRedirectParams {\n id: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IDeleteRedirectRepository {\n execute(params: IDeleteWbRedirectParams): Promise<Result<void, RepositoryError>>;\n}\n\nexport interface IDeleteRedirectRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IDeleteRedirectRepositoryErrors[keyof IDeleteRedirectRepositoryErrors];\n\nexport const DeleteRedirectRepository = createAbstraction<IDeleteRedirectRepository>(\n \"Wb/DeleteRedirectRepository\"\n);\n\nexport namespace DeleteRedirectRepository {\n export type Interface = IDeleteRedirectRepository;\n export type Params = IDeleteWbRedirectParams;\n export type Return = Promise<Result<void, RepositoryError>>;\n export type Error = RepositoryError;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IDeleteRedirectUseCase {\n execute(params: IDeleteWbRedirectParams): Promise<Result<void, UseCaseError>>;\n}\n\nexport interface IDeleteRedirectUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IDeleteRedirectUseCaseErrors[keyof IDeleteRedirectUseCaseErrors];\n\nexport const DeleteRedirectUseCase = createAbstraction<IDeleteRedirectUseCase>(\n \"Wb/DeleteRedirectUseCase\"\n);\n\nexport namespace DeleteRedirectUseCase {\n export type Interface = IDeleteRedirectUseCase;\n export type Params = IDeleteWbRedirectParams;\n export type Return = Promise<Result<void, UseCaseError>>;\n export type Error = UseCaseError;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeDeletePayload {\n redirect: WbRedirect;\n}\n\nexport interface RedirectAfterDeletePayload {\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeDeleteHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeDeletePayload>>\n>(\"Wb/RedirectBeforeDeleteHandler\");\n\nexport namespace RedirectBeforeDeleteHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeDeletePayload>>;\n export type Event = DomainEvent<RedirectBeforeDeletePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterDeleteHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterDeletePayload>>\n>(\"Wb/RedirectAfterDeleteHandler\");\n\nexport namespace RedirectAfterDeleteHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterDeletePayload>>;\n export type Event = DomainEvent<RedirectAfterDeletePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAUpE;AACA;AACA;;AAMA;AACA;AACA;;AAaA,OAAO,MAAMC,wBAAwB,GAAGD,iBAAiB,CACrD,6BACJ,CAAC;;AASD;AACA;AACA;;AAcA,OAAO,MAAME,qBAAqB,GAAGF,iBAAiB,CAClD,0BACJ,CAAC;;AASD;AACA;AACA;;AAUA;AACA;AACA;;AAEA,OAAO,MAAMG,2BAA2B,GAAGH,iBAAiB,CAE1D,gCAAgC,CAAC;AAQnC,OAAO,MAAMI,0BAA0B,GAAGJ,iBAAiB,CAEzD,+BAA+B,CAAC","ignoreList":[]}
@@ -1,7 +1,9 @@
1
1
  import { GetActiveRedirectsUseCase as UseCaseAbstraction, GetActiveRedirectsRepository } from "./abstractions.js";
2
+ import { WbPermissions } from "../../../domain/permissions.js";
2
3
  declare class GetActiveRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {
4
+ private permissions;
3
5
  private repository;
4
- constructor(repository: GetActiveRedirectsRepository.Interface);
6
+ constructor(permissions: WbPermissions.Interface, repository: GetActiveRedirectsRepository.Interface);
5
7
  execute(): UseCaseAbstraction.Return;
6
8
  }
7
9
  export declare const GetActiveRedirectsUseCase: import("@webiny/di").Implementation<typeof GetActiveRedirectsUseCaseImpl>;
@@ -1,17 +1,24 @@
1
- import { createImplementation } from "@webiny/feature/api";
1
+ import { Result, createImplementation } from "@webiny/feature/api";
2
2
  import { GetActiveRedirectsUseCase as UseCaseAbstraction, GetActiveRedirectsRepository } from "./abstractions.js";
3
+ import { WbPermissions } from "../../../domain/permissions.js";
4
+ import { RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
3
5
  class GetActiveRedirectsUseCaseImpl {
4
- constructor(repository) {
6
+ constructor(permissions, repository) {
7
+ this.permissions = permissions;
5
8
  this.repository = repository;
6
9
  }
7
10
  async execute() {
11
+ const hasPermission = await this.permissions.canRead("redirect");
12
+ if (!hasPermission) {
13
+ return Result.fail(new RedirectNotAuthorizedError());
14
+ }
8
15
  return await this.repository.execute();
9
16
  }
10
17
  }
11
18
  export const GetActiveRedirectsUseCase = createImplementation({
12
19
  abstraction: UseCaseAbstraction,
13
20
  implementation: GetActiveRedirectsUseCaseImpl,
14
- dependencies: [GetActiveRedirectsRepository]
21
+ dependencies: [WbPermissions.Abstraction, GetActiveRedirectsRepository]
15
22
  });
16
23
 
17
24
  //# sourceMappingURL=GetActiveRedirectsUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createImplementation","GetActiveRedirectsUseCase","UseCaseAbstraction","GetActiveRedirectsRepository","GetActiveRedirectsUseCaseImpl","constructor","repository","execute","abstraction","implementation","dependencies"],"sources":["GetActiveRedirectsUseCase.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport {\n GetActiveRedirectsUseCase as UseCaseAbstraction,\n GetActiveRedirectsRepository\n} from \"./abstractions.js\";\n\nclass GetActiveRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: GetActiveRedirectsRepository.Interface) {}\n\n async execute(): UseCaseAbstraction.Return {\n return await this.repository.execute();\n }\n}\n\nexport const GetActiveRedirectsUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: GetActiveRedirectsUseCaseImpl,\n dependencies: [GetActiveRedirectsRepository]\n});\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,qBAAqB;AAC1D,SACIC,yBAAyB,IAAIC,kBAAkB,EAC/CC,4BAA4B;AAGhC,MAAMC,6BAA6B,CAAyC;EACxEC,WAAWA,CAASC,UAAkD,EAAE;IAAA,KAApDA,UAAkD,GAAlDA,UAAkD;EAAG;EAEzE,MAAMC,OAAOA,CAAA,EAA8B;IACvC,OAAO,MAAM,IAAI,CAACD,UAAU,CAACC,OAAO,CAAC,CAAC;EAC1C;AACJ;AAEA,OAAO,MAAMN,yBAAyB,GAAGD,oBAAoB,CAAC;EAC1DQ,WAAW,EAAEN,kBAAkB;EAC/BO,cAAc,EAAEL,6BAA6B;EAC7CM,YAAY,EAAE,CAACP,4BAA4B;AAC/C,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","GetActiveRedirectsUseCase","UseCaseAbstraction","GetActiveRedirectsRepository","WbPermissions","RedirectNotAuthorizedError","GetActiveRedirectsUseCaseImpl","constructor","permissions","repository","execute","hasPermission","canRead","fail","abstraction","implementation","dependencies","Abstraction"],"sources":["GetActiveRedirectsUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n GetActiveRedirectsUseCase as UseCaseAbstraction,\n GetActiveRedirectsRepository\n} from \"./abstractions.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { RedirectNotAuthorizedError } from \"~/domain/redirect/errors.js\";\n\nclass GetActiveRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private repository: GetActiveRedirectsRepository.Interface\n ) {}\n\n async execute(): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canRead(\"redirect\");\n if (!hasPermission) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n return await this.repository.execute();\n }\n}\n\nexport const GetActiveRedirectsUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: GetActiveRedirectsUseCaseImpl,\n dependencies: [WbPermissions.Abstraction, GetActiveRedirectsRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,yBAAyB,IAAIC,kBAAkB,EAC/CC,4BAA4B;AAEhC,SAASC,aAAa;AACtB,SAASC,0BAA0B;AAEnC,MAAMC,6BAA6B,CAAyC;EACxEC,WAAWA,CACCC,WAAoC,EACpCC,UAAkD,EAC5D;IAAA,KAFUD,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,UAAkD,GAAlDA,UAAkD;EAC3D;EAEH,MAAMC,OAAOA,CAAA,EAA8B;IACvC,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACH,WAAW,CAACI,OAAO,CAAC,UAAU,CAAC;IAChE,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOZ,MAAM,CAACc,IAAI,CAAC,IAAIR,0BAA0B,CAAC,CAAC,CAAC;IACxD;IAEA,OAAO,MAAM,IAAI,CAACI,UAAU,CAACC,OAAO,CAAC,CAAC;EAC1C;AACJ;AAEA,OAAO,MAAMT,yBAAyB,GAAGD,oBAAoB,CAAC;EAC1Dc,WAAW,EAAEZ,kBAAkB;EAC/Ba,cAAc,EAAET,6BAA6B;EAC7CU,YAAY,EAAE,CAACZ,aAAa,CAACa,WAAW,EAAEd,4BAA4B;AAC1E,CAAC,CAAC","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import type { Result } from "@webiny/feature/api";
2
2
  import type { WbRedirect } from "../../../domain/redirect/abstractions.js";
3
- import type { RedirectPersistenceError } from "../../../domain/redirect/errors.js";
3
+ import type { RedirectPersistenceError, RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
4
4
  /**
5
5
  * GetActiveRedirects repository interface
6
6
  */
@@ -25,6 +25,7 @@ export interface IGetActiveRedirectsUseCase {
25
25
  execute(): Promise<Result<WbRedirect[], UseCaseError>>;
26
26
  }
27
27
  export interface IGetActiveRedirectsUseCaseErrors {
28
+ notAuthorized: RedirectNotAuthorizedError;
28
29
  persistence: RedirectPersistenceError;
29
30
  }
30
31
  type UseCaseError = IGetActiveRedirectsUseCaseErrors[keyof IGetActiveRedirectsUseCaseErrors];
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","GetActiveRedirectsRepository","GetActiveRedirectsUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type { RedirectPersistenceError } from \"~/domain/redirect/errors.js\";\n\n/**\n * GetActiveRedirects repository interface\n */\nexport interface IGetActiveRedirectsRepository {\n execute(): Promise<Result<WbRedirect[], RepositoryError>>;\n}\n\nexport interface IGetActiveRedirectsRepositoryErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError =\n IGetActiveRedirectsRepositoryErrors[keyof IGetActiveRedirectsRepositoryErrors];\n\nexport const GetActiveRedirectsRepository = createAbstraction<IGetActiveRedirectsRepository>(\n \"Wb/GetActiveRedirectsRepository\"\n);\n\nexport namespace GetActiveRedirectsRepository {\n export type Interface = IGetActiveRedirectsRepository;\n export type Error = RepositoryError;\n export type Return = Promise<Result<WbRedirect[], RepositoryError>>;\n export type Redirect = WbRedirect;\n}\n\n/**\n * GetActiveRedirects use case interface\n */\nexport interface IGetActiveRedirectsUseCase {\n execute(): Promise<Result<WbRedirect[], UseCaseError>>;\n}\n\nexport interface IGetActiveRedirectsUseCaseErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IGetActiveRedirectsUseCaseErrors[keyof IGetActiveRedirectsUseCaseErrors];\n\nexport const GetActiveRedirectsUseCase = createAbstraction<IGetActiveRedirectsUseCase>(\n \"Wb/GetActiveRedirectsUseCase\"\n);\n\nexport namespace GetActiveRedirectsUseCase {\n export type Interface = IGetActiveRedirectsUseCase;\n export type Return = Promise<Result<WbRedirect[], UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAKvD;AACA;AACA;;AAYA,OAAO,MAAMC,4BAA4B,GAAGD,iBAAiB,CACzD,iCACJ,CAAC;;AASD;AACA;AACA;;AAWA,OAAO,MAAME,yBAAyB,GAAGF,iBAAiB,CACtD,8BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","GetActiveRedirectsRepository","GetActiveRedirectsUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type {\n RedirectPersistenceError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n/**\n * GetActiveRedirects repository interface\n */\nexport interface IGetActiveRedirectsRepository {\n execute(): Promise<Result<WbRedirect[], RepositoryError>>;\n}\n\nexport interface IGetActiveRedirectsRepositoryErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError =\n IGetActiveRedirectsRepositoryErrors[keyof IGetActiveRedirectsRepositoryErrors];\n\nexport const GetActiveRedirectsRepository = createAbstraction<IGetActiveRedirectsRepository>(\n \"Wb/GetActiveRedirectsRepository\"\n);\n\nexport namespace GetActiveRedirectsRepository {\n export type Interface = IGetActiveRedirectsRepository;\n export type Error = RepositoryError;\n export type Return = Promise<Result<WbRedirect[], RepositoryError>>;\n export type Redirect = WbRedirect;\n}\n\n/**\n * GetActiveRedirects use case interface\n */\nexport interface IGetActiveRedirectsUseCase {\n execute(): Promise<Result<WbRedirect[], UseCaseError>>;\n}\n\nexport interface IGetActiveRedirectsUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IGetActiveRedirectsUseCaseErrors[keyof IGetActiveRedirectsUseCaseErrors];\n\nexport const GetActiveRedirectsUseCase = createAbstraction<IGetActiveRedirectsUseCase>(\n \"Wb/GetActiveRedirectsUseCase\"\n);\n\nexport namespace GetActiveRedirectsUseCase {\n export type Interface = IGetActiveRedirectsUseCase;\n export type Return = Promise<Result<WbRedirect[], UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAQvD;AACA;AACA;;AAYA,OAAO,MAAMC,4BAA4B,GAAGD,iBAAiB,CACzD,iCACJ,CAAC;;AASD;AACA;AACA;;AAYA,OAAO,MAAME,yBAAyB,GAAGF,iBAAiB,CACtD,8BACJ,CAAC","ignoreList":[]}
@@ -1,7 +1,9 @@
1
1
  import { GetRedirectByIdUseCase as UseCaseAbstraction, GetRedirectByIdRepository } from "./abstractions.js";
2
+ import { WbPermissions } from "../../../domain/permissions.js";
2
3
  declare class GetRedirectByIdUseCaseImpl implements UseCaseAbstraction.Interface {
4
+ private permissions;
3
5
  private repository;
4
- constructor(repository: GetRedirectByIdRepository.Interface);
6
+ constructor(permissions: WbPermissions.Interface, repository: GetRedirectByIdRepository.Interface);
5
7
  execute(id: string): UseCaseAbstraction.Return;
6
8
  }
7
9
  export declare const GetRedirectByIdUseCase: import("@webiny/di").Implementation<typeof GetRedirectByIdUseCaseImpl>;
@@ -1,17 +1,32 @@
1
- import { createImplementation } from "@webiny/feature/api";
1
+ import { Result, createImplementation } from "@webiny/feature/api";
2
2
  import { GetRedirectByIdUseCase as UseCaseAbstraction, GetRedirectByIdRepository } from "./abstractions.js";
3
+ import { WbPermissions } from "../../../domain/permissions.js";
4
+ import { RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
3
5
  class GetRedirectByIdUseCaseImpl {
4
- constructor(repository) {
6
+ constructor(permissions, repository) {
7
+ this.permissions = permissions;
5
8
  this.repository = repository;
6
9
  }
7
10
  async execute(id) {
8
- return await this.repository.execute(id);
11
+ const hasPermission = await this.permissions.canRead("redirect");
12
+ if (!hasPermission) {
13
+ return Result.fail(new RedirectNotAuthorizedError());
14
+ }
15
+ const result = await this.repository.execute(id);
16
+ if (result.isFail()) {
17
+ return result;
18
+ }
19
+ const canAccess = await this.permissions.canAccess("redirect", result.value);
20
+ if (!canAccess) {
21
+ return Result.fail(new RedirectNotAuthorizedError());
22
+ }
23
+ return result;
9
24
  }
10
25
  }
11
26
  export const GetRedirectByIdUseCase = createImplementation({
12
27
  abstraction: UseCaseAbstraction,
13
28
  implementation: GetRedirectByIdUseCaseImpl,
14
- dependencies: [GetRedirectByIdRepository]
29
+ dependencies: [WbPermissions.Abstraction, GetRedirectByIdRepository]
15
30
  });
16
31
 
17
32
  //# sourceMappingURL=GetRedirectByIdUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createImplementation","GetRedirectByIdUseCase","UseCaseAbstraction","GetRedirectByIdRepository","GetRedirectByIdUseCaseImpl","constructor","repository","execute","id","abstraction","implementation","dependencies"],"sources":["GetRedirectByIdUseCase.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport {\n GetRedirectByIdUseCase as UseCaseAbstraction,\n GetRedirectByIdRepository\n} from \"./abstractions.js\";\n\nclass GetRedirectByIdUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: GetRedirectByIdRepository.Interface) {}\n\n async execute(id: string): UseCaseAbstraction.Return {\n return await this.repository.execute(id);\n }\n}\n\nexport const GetRedirectByIdUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: GetRedirectByIdUseCaseImpl,\n dependencies: [GetRedirectByIdRepository]\n});\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,qBAAqB;AAC1D,SACIC,sBAAsB,IAAIC,kBAAkB,EAC5CC,yBAAyB;AAG7B,MAAMC,0BAA0B,CAAyC;EACrEC,WAAWA,CAASC,UAA+C,EAAE;IAAA,KAAjDA,UAA+C,GAA/CA,UAA+C;EAAG;EAEtE,MAAMC,OAAOA,CAACC,EAAU,EAA6B;IACjD,OAAO,MAAM,IAAI,CAACF,UAAU,CAACC,OAAO,CAACC,EAAE,CAAC;EAC5C;AACJ;AAEA,OAAO,MAAMP,sBAAsB,GAAGD,oBAAoB,CAAC;EACvDS,WAAW,EAAEP,kBAAkB;EAC/BQ,cAAc,EAAEN,0BAA0B;EAC1CO,YAAY,EAAE,CAACR,yBAAyB;AAC5C,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","GetRedirectByIdUseCase","UseCaseAbstraction","GetRedirectByIdRepository","WbPermissions","RedirectNotAuthorizedError","GetRedirectByIdUseCaseImpl","constructor","permissions","repository","execute","id","hasPermission","canRead","fail","result","isFail","canAccess","value","abstraction","implementation","dependencies","Abstraction"],"sources":["GetRedirectByIdUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n GetRedirectByIdUseCase as UseCaseAbstraction,\n GetRedirectByIdRepository\n} from \"./abstractions.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { RedirectNotAuthorizedError } from \"~/domain/redirect/errors.js\";\n\nclass GetRedirectByIdUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private repository: GetRedirectByIdRepository.Interface\n ) {}\n\n async execute(id: string): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canRead(\"redirect\");\n if (!hasPermission) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n const result = await this.repository.execute(id);\n\n if (result.isFail()) {\n return result;\n }\n\n const canAccess = await this.permissions.canAccess(\"redirect\", result.value);\n if (!canAccess) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n return result;\n }\n}\n\nexport const GetRedirectByIdUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: GetRedirectByIdUseCaseImpl,\n dependencies: [WbPermissions.Abstraction, GetRedirectByIdRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,sBAAsB,IAAIC,kBAAkB,EAC5CC,yBAAyB;AAE7B,SAASC,aAAa;AACtB,SAASC,0BAA0B;AAEnC,MAAMC,0BAA0B,CAAyC;EACrEC,WAAWA,CACCC,WAAoC,EACpCC,UAA+C,EACzD;IAAA,KAFUD,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,UAA+C,GAA/CA,UAA+C;EACxD;EAEH,MAAMC,OAAOA,CAACC,EAAU,EAA6B;IACjD,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACJ,WAAW,CAACK,OAAO,CAAC,UAAU,CAAC;IAChE,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOb,MAAM,CAACe,IAAI,CAAC,IAAIT,0BAA0B,CAAC,CAAC,CAAC;IACxD;IAEA,MAAMU,MAAM,GAAG,MAAM,IAAI,CAACN,UAAU,CAACC,OAAO,CAACC,EAAE,CAAC;IAEhD,IAAII,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOD,MAAM;IACjB;IAEA,MAAME,SAAS,GAAG,MAAM,IAAI,CAACT,WAAW,CAACS,SAAS,CAAC,UAAU,EAAEF,MAAM,CAACG,KAAK,CAAC;IAC5E,IAAI,CAACD,SAAS,EAAE;MACZ,OAAOlB,MAAM,CAACe,IAAI,CAAC,IAAIT,0BAA0B,CAAC,CAAC,CAAC;IACxD;IAEA,OAAOU,MAAM;EACjB;AACJ;AAEA,OAAO,MAAMd,sBAAsB,GAAGD,oBAAoB,CAAC;EACvDmB,WAAW,EAAEjB,kBAAkB;EAC/BkB,cAAc,EAAEd,0BAA0B;EAC1Ce,YAAY,EAAE,CAACjB,aAAa,CAACkB,WAAW,EAAEnB,yBAAyB;AACvE,CAAC,CAAC","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import type { Result } from "@webiny/feature/api";
2
2
  import type { WbRedirect } from "../../../domain/redirect/abstractions.js";
3
- import type { RedirectNotFoundError, RedirectPersistenceError } from "../../../domain/redirect/errors.js";
3
+ import type { RedirectNotFoundError, RedirectPersistenceError, RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
4
4
  /**
5
5
  * GetRedirectById repository interface
6
6
  */
@@ -26,6 +26,7 @@ export interface IGetRedirectByIdUseCase {
26
26
  execute(id: string): Promise<Result<WbRedirect, UseCaseError>>;
27
27
  }
28
28
  export interface IGetRedirectByIdUseCaseErrors {
29
+ notAuthorized: RedirectNotAuthorizedError;
29
30
  notFound: RedirectNotFoundError;
30
31
  persistence: RedirectPersistenceError;
31
32
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","GetRedirectByIdRepository","GetRedirectByIdUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type { RedirectNotFoundError, RedirectPersistenceError } from \"~/domain/redirect/errors.js\";\n\n/**\n * GetRedirectById repository interface\n */\nexport interface IGetRedirectByIdRepository {\n execute(id: string): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface IGetRedirectByIdRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IGetRedirectByIdRepositoryErrors[keyof IGetRedirectByIdRepositoryErrors];\n\nexport const GetRedirectByIdRepository = createAbstraction<IGetRedirectByIdRepository>(\n \"Wb/GetRedirectByIdRepository\"\n);\n\nexport namespace GetRedirectByIdRepository {\n export type Interface = IGetRedirectByIdRepository;\n export type Error = RepositoryError;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Redirect = WbRedirect;\n}\n\n/**\n * GetRedirectById use case interface\n */\nexport interface IGetRedirectByIdUseCase {\n execute(id: string): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface IGetRedirectByIdUseCaseErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IGetRedirectByIdUseCaseErrors[keyof IGetRedirectByIdUseCaseErrors];\n\nexport const GetRedirectByIdUseCase = createAbstraction<IGetRedirectByIdUseCase>(\n \"Wb/GetRedirectByIdUseCase\"\n);\n\nexport namespace GetRedirectByIdUseCase {\n export type Interface = IGetRedirectByIdUseCase;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAKvD;AACA;AACA;;AAYA,OAAO,MAAMC,yBAAyB,GAAGD,iBAAiB,CACtD,8BACJ,CAAC;;AASD;AACA;AACA;;AAYA,OAAO,MAAME,sBAAsB,GAAGF,iBAAiB,CACnD,2BACJ,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","GetRedirectByIdRepository","GetRedirectByIdUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type {\n RedirectNotFoundError,\n RedirectPersistenceError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n/**\n * GetRedirectById repository interface\n */\nexport interface IGetRedirectByIdRepository {\n execute(id: string): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface IGetRedirectByIdRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IGetRedirectByIdRepositoryErrors[keyof IGetRedirectByIdRepositoryErrors];\n\nexport const GetRedirectByIdRepository = createAbstraction<IGetRedirectByIdRepository>(\n \"Wb/GetRedirectByIdRepository\"\n);\n\nexport namespace GetRedirectByIdRepository {\n export type Interface = IGetRedirectByIdRepository;\n export type Error = RepositoryError;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Redirect = WbRedirect;\n}\n\n/**\n * GetRedirectById use case interface\n */\nexport interface IGetRedirectByIdUseCase {\n execute(id: string): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface IGetRedirectByIdUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IGetRedirectByIdUseCaseErrors[keyof IGetRedirectByIdUseCaseErrors];\n\nexport const GetRedirectByIdUseCase = createAbstraction<IGetRedirectByIdUseCase>(\n \"Wb/GetRedirectByIdUseCase\"\n);\n\nexport namespace GetRedirectByIdUseCase {\n export type Interface = IGetRedirectByIdUseCase;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;;AASvD;AACA;AACA;;AAYA,OAAO,MAAMC,yBAAyB,GAAGD,iBAAiB,CACtD,8BACJ,CAAC;;AASD;AACA;AACA;;AAaA,OAAO,MAAME,sBAAsB,GAAGF,iBAAiB,CACnD,2BACJ,CAAC","ignoreList":[]}
@@ -1,7 +1,11 @@
1
1
  import { ListRedirectsUseCase as UseCaseAbstraction, ListRedirectsRepository } from "./abstractions.js";
2
+ import { WbPermissions } from "../../../domain/permissions.js";
3
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
2
4
  declare class ListRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {
5
+ private permissions;
6
+ private identityContext;
3
7
  private repository;
4
- constructor(repository: ListRedirectsRepository.Interface);
8
+ constructor(permissions: WbPermissions.Interface, identityContext: IdentityContext.Interface, repository: ListRedirectsRepository.Interface);
5
9
  execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
6
10
  }
7
11
  export declare const ListRedirectsUseCase: import("@webiny/di").Implementation<typeof ListRedirectsUseCaseImpl>;
@@ -1,17 +1,36 @@
1
- import { createImplementation } from "@webiny/feature/api";
1
+ import { Result, createImplementation } from "@webiny/feature/api";
2
2
  import { ListRedirectsUseCase as UseCaseAbstraction, ListRedirectsRepository } from "./abstractions.js";
3
+ import { WbPermissions } from "../../../domain/permissions.js";
4
+ import { RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
5
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
3
6
  class ListRedirectsUseCaseImpl {
4
- constructor(repository) {
7
+ constructor(permissions, identityContext, repository) {
8
+ this.permissions = permissions;
9
+ this.identityContext = identityContext;
5
10
  this.repository = repository;
6
11
  }
7
12
  async execute(params) {
8
- return await this.repository.execute(params);
13
+ const hasPermission = await this.permissions.canRead("redirect");
14
+ if (!hasPermission) {
15
+ return Result.fail(new RedirectNotAuthorizedError());
16
+ }
17
+ const where = {
18
+ ...params.where
19
+ };
20
+ if (await this.permissions.onlyOwnRecords("redirect")) {
21
+ const identity = this.identityContext.getIdentity();
22
+ where.createdBy = identity.id;
23
+ }
24
+ return await this.repository.execute({
25
+ ...params,
26
+ where
27
+ });
9
28
  }
10
29
  }
11
30
  export const ListRedirectsUseCase = createImplementation({
12
31
  abstraction: UseCaseAbstraction,
13
32
  implementation: ListRedirectsUseCaseImpl,
14
- dependencies: [ListRedirectsRepository]
33
+ dependencies: [WbPermissions.Abstraction, IdentityContext, ListRedirectsRepository]
15
34
  });
16
35
 
17
36
  //# sourceMappingURL=ListRedirectsUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createImplementation","ListRedirectsUseCase","UseCaseAbstraction","ListRedirectsRepository","ListRedirectsUseCaseImpl","constructor","repository","execute","params","abstraction","implementation","dependencies"],"sources":["ListRedirectsUseCase.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport {\n ListRedirectsUseCase as UseCaseAbstraction,\n ListRedirectsRepository\n} from \"./abstractions.js\";\n\nclass ListRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(private repository: ListRedirectsRepository.Interface) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n return await this.repository.execute(params);\n }\n}\n\nexport const ListRedirectsUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: ListRedirectsUseCaseImpl,\n dependencies: [ListRedirectsRepository]\n});\n"],"mappings":"AAAA,SAASA,oBAAoB,QAAQ,qBAAqB;AAC1D,SACIC,oBAAoB,IAAIC,kBAAkB,EAC1CC,uBAAuB;AAG3B,MAAMC,wBAAwB,CAAyC;EACnEC,WAAWA,CAASC,UAA6C,EAAE;IAAA,KAA/CA,UAA6C,GAA7CA,UAA6C;EAAG;EAEpE,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE,OAAO,MAAM,IAAI,CAACF,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;EAChD;AACJ;AAEA,OAAO,MAAMP,oBAAoB,GAAGD,oBAAoB,CAAC;EACrDS,WAAW,EAAEP,kBAAkB;EAC/BQ,cAAc,EAAEN,wBAAwB;EACxCO,YAAY,EAAE,CAACR,uBAAuB;AAC1C,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","ListRedirectsUseCase","UseCaseAbstraction","ListRedirectsRepository","WbPermissions","RedirectNotAuthorizedError","IdentityContext","ListRedirectsUseCaseImpl","constructor","permissions","identityContext","repository","execute","params","hasPermission","canRead","fail","where","onlyOwnRecords","identity","getIdentity","createdBy","id","abstraction","implementation","dependencies","Abstraction"],"sources":["ListRedirectsUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n ListRedirectsUseCase as UseCaseAbstraction,\n ListRedirectsRepository\n} from \"./abstractions.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { RedirectNotAuthorizedError } from \"~/domain/redirect/errors.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nclass ListRedirectsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private identityContext: IdentityContext.Interface,\n private repository: ListRedirectsRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canRead(\"redirect\");\n if (!hasPermission) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n const where = { ...params.where };\n\n if (await this.permissions.onlyOwnRecords(\"redirect\")) {\n const identity = this.identityContext.getIdentity();\n where.createdBy = identity.id;\n }\n\n return await this.repository.execute({ ...params, where });\n }\n}\n\nexport const ListRedirectsUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: ListRedirectsUseCaseImpl,\n dependencies: [WbPermissions.Abstraction, IdentityContext, ListRedirectsRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,oBAAoB,IAAIC,kBAAkB,EAC1CC,uBAAuB;AAE3B,SAASC,aAAa;AACtB,SAASC,0BAA0B;AACnC,SAASC,eAAe,QAAQ,6DAA6D;AAE7F,MAAMC,wBAAwB,CAAyC;EACnEC,WAAWA,CACCC,WAAoC,EACpCC,eAA0C,EAC1CC,UAA6C,EACvD;IAAA,KAHUF,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAA6C,GAA7CA,UAA6C;EACtD;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACL,WAAW,CAACM,OAAO,CAAC,UAAU,CAAC;IAChE,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOf,MAAM,CAACiB,IAAI,CAAC,IAAIX,0BAA0B,CAAC,CAAC,CAAC;IACxD;IAEA,MAAMY,KAAK,GAAG;MAAE,GAAGJ,MAAM,CAACI;IAAM,CAAC;IAEjC,IAAI,MAAM,IAAI,CAACR,WAAW,CAACS,cAAc,CAAC,UAAU,CAAC,EAAE;MACnD,MAAMC,QAAQ,GAAG,IAAI,CAACT,eAAe,CAACU,WAAW,CAAC,CAAC;MACnDH,KAAK,CAACI,SAAS,GAAGF,QAAQ,CAACG,EAAE;IACjC;IAEA,OAAO,MAAM,IAAI,CAACX,UAAU,CAACC,OAAO,CAAC;MAAE,GAAGC,MAAM;MAAEI;IAAM,CAAC,CAAC;EAC9D;AACJ;AAEA,OAAO,MAAMhB,oBAAoB,GAAGD,oBAAoB,CAAC;EACrDuB,WAAW,EAAErB,kBAAkB;EAC/BsB,cAAc,EAAEjB,wBAAwB;EACxCkB,YAAY,EAAE,CAACrB,aAAa,CAACsB,WAAW,EAAEpB,eAAe,EAAEH,uBAAuB;AACtF,CAAC,CAAC","ignoreList":[]}
@@ -1,9 +1,10 @@
1
1
  import type { Result } from "@webiny/feature/api";
2
2
  import type { CmsEntryListSort } from "@webiny/api-headless-cms/types/index.js";
3
3
  import type { WbRedirect } from "../../../domain/redirect/abstractions.js";
4
- import type { RedirectPersistenceError } from "../../../domain/redirect/errors.js";
4
+ import type { RedirectPersistenceError, RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
5
5
  export interface IListWbRedirectsWhere {
6
6
  latest?: boolean;
7
+ createdBy?: string;
7
8
  redirectFrom?: string;
8
9
  redirectFrom_not?: string;
9
10
  redirectFrom_in?: string[];
@@ -53,6 +54,7 @@ export interface IListRedirectsUseCase {
53
54
  execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, UseCaseError>>;
54
55
  }
55
56
  export interface IListRedirectsUseCaseErrors {
57
+ notAuthorized: RedirectNotAuthorizedError;
56
58
  persistence: RedirectPersistenceError;
57
59
  }
58
60
  type UseCaseError = IListRedirectsUseCaseErrors[keyof IListRedirectsUseCaseErrors];
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","ListRedirectsRepository","ListRedirectsUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import type { Result } from \"@webiny/feature/api\";\nimport { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsEntryListSort } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type { RedirectPersistenceError } from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IListWbRedirectsWhere {\n latest?: boolean;\n redirectFrom?: string;\n redirectFrom_not?: string;\n redirectFrom_in?: string[];\n redirectFrom_not_in?: string[];\n\n redirectTo?: string;\n redirectTo_not?: string;\n redirectTo_in?: string[];\n redirectTo_not_in?: string[];\n\n redirectType?: string;\n redirectType_not?: string;\n redirectType_in?: string[];\n redirectType_not_in?: string[];\n\n isEnabled?: boolean;\n}\n\nexport interface ListWbRedirectsParams {\n where?: IListWbRedirectsWhere;\n sort?: CmsEntryListSort;\n limit?: number;\n after?: string | null;\n search?: string;\n}\n\nexport interface WbListMeta {\n hasMoreItems: boolean;\n totalCount: number;\n cursor: string | null;\n}\n\nexport type ListRedirectsResult = { redirects: WbRedirect[]; meta: WbListMeta };\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IListRedirectsRepository {\n execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, RepositoryError>>;\n}\n\nexport interface IListRedirectsRepositoryErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IListRedirectsRepositoryErrors[keyof IListRedirectsRepositoryErrors];\n\nexport const ListRedirectsRepository = createAbstraction<IListRedirectsRepository>(\n \"Wb/ListRedirectsRepository\"\n);\n\nexport namespace ListRedirectsRepository {\n export type Interface = IListRedirectsRepository;\n export type Params = ListWbRedirectsParams;\n export type Return = Promise<Result<ListRedirectsResult, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IListRedirectsUseCase {\n execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, UseCaseError>>;\n}\n\nexport interface IListRedirectsUseCaseErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IListRedirectsUseCaseErrors[keyof IListRedirectsUseCaseErrors];\n\nexport const ListRedirectsUseCase =\n createAbstraction<IListRedirectsUseCase>(\"Wb/ListRedirectsUseCase\");\n\nexport namespace ListRedirectsUseCase {\n export type Interface = IListRedirectsUseCase;\n export type Params = ListWbRedirectsParams;\n export type Return = Promise<Result<ListRedirectsResult, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAKvD;AACA;AACA;;AAsCA;AACA;AACA;;AAYA,OAAO,MAAMC,uBAAuB,GAAGD,iBAAiB,CACpD,4BACJ,CAAC;;AAUD;AACA;AACA;;AAYA,OAAO,MAAME,oBAAoB,GAC7BF,iBAAiB,CAAwB,yBAAyB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","ListRedirectsRepository","ListRedirectsUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import type { Result } from \"@webiny/feature/api\";\nimport { createAbstraction } from \"@webiny/feature/api\";\nimport type { CmsEntryListSort } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport type {\n RedirectPersistenceError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IListWbRedirectsWhere {\n latest?: boolean;\n createdBy?: string;\n redirectFrom?: string;\n redirectFrom_not?: string;\n redirectFrom_in?: string[];\n redirectFrom_not_in?: string[];\n\n redirectTo?: string;\n redirectTo_not?: string;\n redirectTo_in?: string[];\n redirectTo_not_in?: string[];\n\n redirectType?: string;\n redirectType_not?: string;\n redirectType_in?: string[];\n redirectType_not_in?: string[];\n\n isEnabled?: boolean;\n}\n\nexport interface ListWbRedirectsParams {\n where?: IListWbRedirectsWhere;\n sort?: CmsEntryListSort;\n limit?: number;\n after?: string | null;\n search?: string;\n}\n\nexport interface WbListMeta {\n hasMoreItems: boolean;\n totalCount: number;\n cursor: string | null;\n}\n\nexport type ListRedirectsResult = { redirects: WbRedirect[]; meta: WbListMeta };\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IListRedirectsRepository {\n execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, RepositoryError>>;\n}\n\nexport interface IListRedirectsRepositoryErrors {\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IListRedirectsRepositoryErrors[keyof IListRedirectsRepositoryErrors];\n\nexport const ListRedirectsRepository = createAbstraction<IListRedirectsRepository>(\n \"Wb/ListRedirectsRepository\"\n);\n\nexport namespace ListRedirectsRepository {\n export type Interface = IListRedirectsRepository;\n export type Params = ListWbRedirectsParams;\n export type Return = Promise<Result<ListRedirectsResult, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IListRedirectsUseCase {\n execute(params: ListWbRedirectsParams): Promise<Result<ListRedirectsResult, UseCaseError>>;\n}\n\nexport interface IListRedirectsUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IListRedirectsUseCaseErrors[keyof IListRedirectsUseCaseErrors];\n\nexport const ListRedirectsUseCase =\n createAbstraction<IListRedirectsUseCase>(\"Wb/ListRedirectsUseCase\");\n\nexport namespace ListRedirectsUseCase {\n export type Interface = IListRedirectsUseCase;\n export type Params = ListWbRedirectsParams;\n export type Return = Promise<Result<ListRedirectsResult, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,qBAAqB;;AAQvD;AACA;AACA;;AAuCA;AACA;AACA;;AAYA,OAAO,MAAMC,uBAAuB,GAAGD,iBAAiB,CACpD,4BACJ,CAAC;;AAUD;AACA;AACA;;AAaA,OAAO,MAAME,oBAAoB,GAC7BF,iBAAiB,CAAwB,yBAAyB,CAAC","ignoreList":[]}
@@ -1,11 +1,13 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { MoveRedirectUseCase as UseCaseAbstraction, MoveRedirectRepository } from "./abstractions.js";
3
3
  import { GetRedirectByIdUseCase } from "../../../features/redirects/GetRedirectById/index.js";
4
+ import { WbPermissions } from "../../../domain/permissions.js";
4
5
  declare class MoveRedirectUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private permissions;
5
7
  private eventPublisher;
6
8
  private getRedirectById;
7
9
  private repository;
8
- constructor(eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: MoveRedirectRepository.Interface);
10
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: MoveRedirectRepository.Interface);
9
11
  execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return;
10
12
  }
11
13
  export declare const MoveRedirectUseCase: import("@webiny/di").Implementation<typeof MoveRedirectUseCaseImpl>;
@@ -3,19 +3,31 @@ import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
3
3
  import { MoveRedirectUseCase as UseCaseAbstraction, MoveRedirectRepository } from "./abstractions.js";
4
4
  import { RedirectBeforeMoveEvent, RedirectAfterMoveEvent } from "./events.js";
5
5
  import { GetRedirectByIdUseCase } from "../GetRedirectById/index.js";
6
+ import { WbPermissions } from "../../../domain/permissions.js";
7
+ import { RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
6
8
  class MoveRedirectUseCaseImpl {
7
- constructor(eventPublisher, getRedirectById, repository) {
9
+ constructor(permissions, eventPublisher, getRedirectById, repository) {
10
+ this.permissions = permissions;
8
11
  this.eventPublisher = eventPublisher;
9
12
  this.getRedirectById = getRedirectById;
10
13
  this.repository = repository;
11
14
  }
12
15
  async execute(params) {
16
+ const hasPermission = await this.permissions.canEdit("redirect");
17
+ if (!hasPermission) {
18
+ return Result.fail(new RedirectNotAuthorizedError());
19
+ }
20
+
13
21
  // Get the original redirect for events
14
22
  const getResult = await this.getRedirectById.execute(params.id);
15
23
  if (getResult.isFail()) {
16
24
  return getResult;
17
25
  }
18
26
  const original = getResult.value;
27
+ const canEdit = await this.permissions.canEdit("redirect", original);
28
+ if (!canEdit) {
29
+ return Result.fail(new RedirectNotAuthorizedError());
30
+ }
19
31
 
20
32
  // Publish before move event
21
33
  const beforeEvent = new RedirectBeforeMoveEvent({
@@ -43,7 +55,7 @@ class MoveRedirectUseCaseImpl {
43
55
  export const MoveRedirectUseCase = createImplementation({
44
56
  abstraction: UseCaseAbstraction,
45
57
  implementation: MoveRedirectUseCaseImpl,
46
- dependencies: [EventPublisher, GetRedirectByIdUseCase, MoveRedirectRepository]
58
+ dependencies: [WbPermissions.Abstraction, EventPublisher, GetRedirectByIdUseCase, MoveRedirectRepository]
47
59
  });
48
60
 
49
61
  //# sourceMappingURL=MoveRedirectUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","createImplementation","EventPublisher","MoveRedirectUseCase","UseCaseAbstraction","MoveRedirectRepository","RedirectBeforeMoveEvent","RedirectAfterMoveEvent","GetRedirectByIdUseCase","MoveRedirectUseCaseImpl","constructor","eventPublisher","getRedirectById","repository","execute","params","getResult","id","isFail","original","value","beforeEvent","input","publish","result","afterEvent","redirect","ok","abstraction","implementation","dependencies"],"sources":["MoveRedirectUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n MoveRedirectUseCase as UseCaseAbstraction,\n MoveRedirectRepository\n} from \"./abstractions.js\";\nimport { RedirectBeforeMoveEvent, RedirectAfterMoveEvent } from \"./events.js\";\nimport { GetRedirectByIdUseCase } from \"~/features/redirects/GetRedirectById/index.js\";\n\nclass MoveRedirectUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private eventPublisher: EventPublisherAbstraction.Interface,\n private getRedirectById: GetRedirectByIdUseCase.Interface,\n private repository: MoveRedirectRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n // Get the original redirect for events\n const getResult = await this.getRedirectById.execute(params.id);\n\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = getResult.value;\n\n // Publish before move event\n const beforeEvent = new RedirectBeforeMoveEvent({\n original,\n input: params\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the move operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n // Publish after move event\n const afterEvent = new RedirectAfterMoveEvent({\n original,\n input: params,\n redirect: result.value\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok(result.value);\n }\n}\n\nexport const MoveRedirectUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: MoveRedirectUseCaseImpl,\n dependencies: [EventPublisher, GetRedirectByIdUseCase, MoveRedirectRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,mBAAmB,IAAIC,kBAAkB,EACzCC,sBAAsB;AAE1B,SAASC,uBAAuB,EAAEC,sBAAsB;AACxD,SAASC,sBAAsB;AAE/B,MAAMC,uBAAuB,CAAyC;EAClEC,WAAWA,CACCC,cAAmD,EACnDC,eAAiD,EACjDC,UAA4C,EACtD;IAAA,KAHUF,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAAiD,GAAjDA,eAAiD;IAAA,KACjDC,UAA4C,GAA5CA,UAA4C;EACrD;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE;IACA,MAAMC,SAAS,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACE,OAAO,CAACC,MAAM,CAACE,EAAE,CAAC;IAE/D,IAAID,SAAS,CAACE,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOF,SAAS;IACpB;IAEA,MAAMG,QAAQ,GAAGH,SAAS,CAACI,KAAK;;IAEhC;IACA,MAAMC,WAAW,GAAG,IAAIf,uBAAuB,CAAC;MAC5Ca,QAAQ;MACRG,KAAK,EAAEP;IACX,CAAC,CAAC;IAEF,MAAM,IAAI,CAACJ,cAAc,CAACY,OAAO,CAACF,WAAW,CAAC;;IAE9C;IACA,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACX,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIS,MAAM,CAACN,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOM,MAAM;IACjB;;IAEA;IACA,MAAMC,UAAU,GAAG,IAAIlB,sBAAsB,CAAC;MAC1CY,QAAQ;MACRG,KAAK,EAAEP,MAAM;MACbW,QAAQ,EAAEF,MAAM,CAACJ;IACrB,CAAC,CAAC;IAEF,MAAM,IAAI,CAACT,cAAc,CAACY,OAAO,CAACE,UAAU,CAAC;IAE7C,OAAOzB,MAAM,CAAC2B,EAAE,CAACH,MAAM,CAACJ,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMjB,mBAAmB,GAAGF,oBAAoB,CAAC;EACpD2B,WAAW,EAAExB,kBAAkB;EAC/ByB,cAAc,EAAEpB,uBAAuB;EACvCqB,YAAY,EAAE,CAAC5B,cAAc,EAAEM,sBAAsB,EAAEH,sBAAsB;AACjF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","createImplementation","EventPublisher","MoveRedirectUseCase","UseCaseAbstraction","MoveRedirectRepository","RedirectBeforeMoveEvent","RedirectAfterMoveEvent","GetRedirectByIdUseCase","WbPermissions","RedirectNotAuthorizedError","MoveRedirectUseCaseImpl","constructor","permissions","eventPublisher","getRedirectById","repository","execute","params","hasPermission","canEdit","fail","getResult","id","isFail","original","value","beforeEvent","input","publish","result","afterEvent","redirect","ok","abstraction","implementation","dependencies","Abstraction"],"sources":["MoveRedirectUseCase.ts"],"sourcesContent":["import { Result, createImplementation } from \"@webiny/feature/api\";\nimport {\n EventPublisher,\n EventPublisher as EventPublisherAbstraction\n} from \"@webiny/api-core/features/EventPublisher\";\nimport {\n MoveRedirectUseCase as UseCaseAbstraction,\n MoveRedirectRepository\n} from \"./abstractions.js\";\nimport { RedirectBeforeMoveEvent, RedirectAfterMoveEvent } from \"./events.js\";\nimport { GetRedirectByIdUseCase } from \"~/features/redirects/GetRedirectById/index.js\";\nimport { WbPermissions } from \"~/domain/permissions.js\";\nimport { RedirectNotAuthorizedError } from \"~/domain/redirect/errors.js\";\n\nclass MoveRedirectUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: WbPermissions.Interface,\n private eventPublisher: EventPublisherAbstraction.Interface,\n private getRedirectById: GetRedirectByIdUseCase.Interface,\n private repository: MoveRedirectRepository.Interface\n ) {}\n\n async execute(params: UseCaseAbstraction.Params): UseCaseAbstraction.Return {\n const hasPermission = await this.permissions.canEdit(\"redirect\");\n if (!hasPermission) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n // Get the original redirect for events\n const getResult = await this.getRedirectById.execute(params.id);\n\n if (getResult.isFail()) {\n return getResult;\n }\n\n const original = getResult.value;\n\n const canEdit = await this.permissions.canEdit(\"redirect\", original);\n if (!canEdit) {\n return Result.fail(new RedirectNotAuthorizedError());\n }\n\n // Publish before move event\n const beforeEvent = new RedirectBeforeMoveEvent({\n original,\n input: params\n });\n\n await this.eventPublisher.publish(beforeEvent);\n\n // Execute the move operation\n const result = await this.repository.execute(params);\n\n if (result.isFail()) {\n return result;\n }\n\n // Publish after move event\n const afterEvent = new RedirectAfterMoveEvent({\n original,\n input: params,\n redirect: result.value\n });\n\n await this.eventPublisher.publish(afterEvent);\n\n return Result.ok(result.value);\n }\n}\n\nexport const MoveRedirectUseCase = createImplementation({\n abstraction: UseCaseAbstraction,\n implementation: MoveRedirectUseCaseImpl,\n dependencies: [\n WbPermissions.Abstraction,\n EventPublisher,\n GetRedirectByIdUseCase,\n MoveRedirectRepository\n ]\n});\n"],"mappings":"AAAA,SAASA,MAAM,EAAEC,oBAAoB,QAAQ,qBAAqB;AAClE,SACIC,cAAc,QAEX,0CAA0C;AACjD,SACIC,mBAAmB,IAAIC,kBAAkB,EACzCC,sBAAsB;AAE1B,SAASC,uBAAuB,EAAEC,sBAAsB;AACxD,SAASC,sBAAsB;AAC/B,SAASC,aAAa;AACtB,SAASC,0BAA0B;AAEnC,MAAMC,uBAAuB,CAAyC;EAClEC,WAAWA,CACCC,WAAoC,EACpCC,cAAmD,EACnDC,eAAiD,EACjDC,UAA4C,EACtD;IAAA,KAJUH,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,cAAmD,GAAnDA,cAAmD;IAAA,KACnDC,eAAiD,GAAjDA,eAAiD;IAAA,KACjDC,UAA4C,GAA5CA,UAA4C;EACrD;EAEH,MAAMC,OAAOA,CAACC,MAAiC,EAA6B;IACxE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACN,WAAW,CAACO,OAAO,CAAC,UAAU,CAAC;IAChE,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOnB,MAAM,CAACqB,IAAI,CAAC,IAAIX,0BAA0B,CAAC,CAAC,CAAC;IACxD;;IAEA;IACA,MAAMY,SAAS,GAAG,MAAM,IAAI,CAACP,eAAe,CAACE,OAAO,CAACC,MAAM,CAACK,EAAE,CAAC;IAE/D,IAAID,SAAS,CAACE,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOF,SAAS;IACpB;IAEA,MAAMG,QAAQ,GAAGH,SAAS,CAACI,KAAK;IAEhC,MAAMN,OAAO,GAAG,MAAM,IAAI,CAACP,WAAW,CAACO,OAAO,CAAC,UAAU,EAAEK,QAAQ,CAAC;IACpE,IAAI,CAACL,OAAO,EAAE;MACV,OAAOpB,MAAM,CAACqB,IAAI,CAAC,IAAIX,0BAA0B,CAAC,CAAC,CAAC;IACxD;;IAEA;IACA,MAAMiB,WAAW,GAAG,IAAIrB,uBAAuB,CAAC;MAC5CmB,QAAQ;MACRG,KAAK,EAAEV;IACX,CAAC,CAAC;IAEF,MAAM,IAAI,CAACJ,cAAc,CAACe,OAAO,CAACF,WAAW,CAAC;;IAE9C;IACA,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACd,UAAU,CAACC,OAAO,CAACC,MAAM,CAAC;IAEpD,IAAIY,MAAM,CAACN,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOM,MAAM;IACjB;;IAEA;IACA,MAAMC,UAAU,GAAG,IAAIxB,sBAAsB,CAAC;MAC1CkB,QAAQ;MACRG,KAAK,EAAEV,MAAM;MACbc,QAAQ,EAAEF,MAAM,CAACJ;IACrB,CAAC,CAAC;IAEF,MAAM,IAAI,CAACZ,cAAc,CAACe,OAAO,CAACE,UAAU,CAAC;IAE7C,OAAO/B,MAAM,CAACiC,EAAE,CAACH,MAAM,CAACJ,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMvB,mBAAmB,GAAGF,oBAAoB,CAAC;EACpDiC,WAAW,EAAE9B,kBAAkB;EAC/B+B,cAAc,EAAExB,uBAAuB;EACvCyB,YAAY,EAAE,CACV3B,aAAa,CAAC4B,WAAW,EACzBnC,cAAc,EACdM,sBAAsB,EACtBH,sBAAsB;AAE9B,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 { WbRedirect } from "../../../domain/redirect/abstractions.js";
5
- import { RedirectNotFoundError, RedirectPersistenceError } from "../../../domain/redirect/errors.js";
5
+ import { RedirectNotFoundError, RedirectPersistenceError, RedirectNotAuthorizedError } from "../../../domain/redirect/errors.js";
6
6
  export interface IMoveWbRedirectParams {
7
7
  id: string;
8
8
  folderId: string;
@@ -27,6 +27,7 @@ export interface IMoveRedirectUseCase {
27
27
  execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, UseCaseError>>;
28
28
  }
29
29
  export interface IMoveRedirectUseCaseErrors {
30
+ notAuthorized: RedirectNotAuthorizedError;
30
31
  notFound: RedirectNotFoundError;
31
32
  persistence: RedirectPersistenceError;
32
33
  }
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","MoveRedirectRepository","MoveRedirectUseCase","RedirectBeforeMoveHandler","RedirectAfterMoveHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport { RedirectNotFoundError, RedirectPersistenceError } from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IMoveWbRedirectParams {\n id: string;\n folderId: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IMoveRedirectRepository {\n execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface IMoveRedirectRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IMoveRedirectRepositoryErrors[keyof IMoveRedirectRepositoryErrors];\n\nexport const MoveRedirectRepository = createAbstraction<IMoveRedirectRepository>(\n \"Wb/MoveRedirectRepository\"\n);\n\nexport namespace MoveRedirectRepository {\n export type Interface = IMoveRedirectRepository;\n export type Params = IMoveWbRedirectParams;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IMoveRedirectUseCase {\n execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface IMoveRedirectUseCaseErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IMoveRedirectUseCaseErrors[keyof IMoveRedirectUseCaseErrors];\n\nexport const MoveRedirectUseCase =\n createAbstraction<IMoveRedirectUseCase>(\"Wb/MoveRedirectUseCase\");\n\nexport namespace MoveRedirectUseCase {\n export type Interface = IMoveRedirectUseCase;\n export type Params = IMoveWbRedirectParams;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeMovePayload {\n original: WbRedirect;\n input: IMoveWbRedirectParams;\n}\n\nexport interface RedirectAfterMovePayload {\n original: WbRedirect;\n input: IMoveWbRedirectParams;\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeMoveHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeMovePayload>>\n>(\"Wb/RedirectBeforeMoveHandler\");\n\nexport namespace RedirectBeforeMoveHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeMovePayload>>;\n export type Event = DomainEvent<RedirectBeforeMovePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterMoveHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterMovePayload>>\n>(\"Wb/RedirectAfterMoveHandler\");\n\nexport namespace RedirectAfterMoveHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterMovePayload>>;\n export type Event = DomainEvent<RedirectAfterMovePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAMpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,sBAAsB,GAAGD,iBAAiB,CACnD,2BACJ,CAAC;;AAUD;AACA;AACA;;AAaA,OAAO,MAAME,mBAAmB,GAC5BF,iBAAiB,CAAuB,wBAAwB,CAAC;;AAUrE;AACA;AACA;;AAaA;AACA;AACA;;AAEA,OAAO,MAAMG,yBAAyB,GAAGH,iBAAiB,CAExD,8BAA8B,CAAC;AAQjC,OAAO,MAAMI,wBAAwB,GAAGJ,iBAAiB,CAEvD,6BAA6B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["createAbstraction","MoveRedirectRepository","MoveRedirectUseCase","RedirectBeforeMoveHandler","RedirectAfterMoveHandler"],"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 { WbRedirect } from \"~/domain/redirect/abstractions.js\";\nimport {\n RedirectNotFoundError,\n RedirectPersistenceError,\n RedirectNotAuthorizedError\n} from \"~/domain/redirect/errors.js\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\nexport interface IMoveWbRedirectParams {\n id: string;\n folderId: string;\n}\n\n// ============================================================================\n// Repository Abstraction\n// ============================================================================\n\nexport interface IMoveRedirectRepository {\n execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, RepositoryError>>;\n}\n\nexport interface IMoveRedirectRepositoryErrors {\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype RepositoryError = IMoveRedirectRepositoryErrors[keyof IMoveRedirectRepositoryErrors];\n\nexport const MoveRedirectRepository = createAbstraction<IMoveRedirectRepository>(\n \"Wb/MoveRedirectRepository\"\n);\n\nexport namespace MoveRedirectRepository {\n export type Interface = IMoveRedirectRepository;\n export type Params = IMoveWbRedirectParams;\n export type Return = Promise<Result<WbRedirect, RepositoryError>>;\n export type Error = RepositoryError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Use Case Abstraction\n// ============================================================================\n\nexport interface IMoveRedirectUseCase {\n execute(params: IMoveWbRedirectParams): Promise<Result<WbRedirect, UseCaseError>>;\n}\n\nexport interface IMoveRedirectUseCaseErrors {\n notAuthorized: RedirectNotAuthorizedError;\n notFound: RedirectNotFoundError;\n persistence: RedirectPersistenceError;\n}\n\ntype UseCaseError = IMoveRedirectUseCaseErrors[keyof IMoveRedirectUseCaseErrors];\n\nexport const MoveRedirectUseCase =\n createAbstraction<IMoveRedirectUseCase>(\"Wb/MoveRedirectUseCase\");\n\nexport namespace MoveRedirectUseCase {\n export type Interface = IMoveRedirectUseCase;\n export type Params = IMoveWbRedirectParams;\n export type Return = Promise<Result<WbRedirect, UseCaseError>>;\n export type Error = UseCaseError;\n export type Redirect = WbRedirect;\n}\n\n// ============================================================================\n// Event Payload Types\n// ============================================================================\n\nexport interface RedirectBeforeMovePayload {\n original: WbRedirect;\n input: IMoveWbRedirectParams;\n}\n\nexport interface RedirectAfterMovePayload {\n original: WbRedirect;\n input: IMoveWbRedirectParams;\n redirect: WbRedirect;\n}\n\n// ============================================================================\n// Event Handler Abstractions\n// ============================================================================\n\nexport const RedirectBeforeMoveHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectBeforeMovePayload>>\n>(\"Wb/RedirectBeforeMoveHandler\");\n\nexport namespace RedirectBeforeMoveHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectBeforeMovePayload>>;\n export type Event = DomainEvent<RedirectBeforeMovePayload>;\n export type Redirect = WbRedirect;\n}\n\nexport const RedirectAfterMoveHandler = createAbstraction<\n IEventHandler<DomainEvent<RedirectAfterMovePayload>>\n>(\"Wb/RedirectAfterMoveHandler\");\n\nexport namespace RedirectAfterMoveHandler {\n export type Interface = IEventHandler<DomainEvent<RedirectAfterMovePayload>>;\n export type Event = DomainEvent<RedirectAfterMovePayload>;\n export type Redirect = WbRedirect;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAqB,qBAAqB;;AAUpE;AACA;AACA;;AAOA;AACA;AACA;;AAaA,OAAO,MAAMC,sBAAsB,GAAGD,iBAAiB,CACnD,2BACJ,CAAC;;AAUD;AACA;AACA;;AAcA,OAAO,MAAME,mBAAmB,GAC5BF,iBAAiB,CAAuB,wBAAwB,CAAC;;AAUrE;AACA;AACA;;AAaA;AACA;AACA;;AAEA,OAAO,MAAMG,yBAAyB,GAAGH,iBAAiB,CAExD,8BAA8B,CAAC;AAQjC,OAAO,MAAMI,wBAAwB,GAAGJ,iBAAiB,CAEvD,6BAA6B,CAAC","ignoreList":[]}
@@ -1,11 +1,13 @@
1
1
  import { EventPublisher as EventPublisherAbstraction } from "@webiny/api-core/features/EventPublisher";
2
2
  import { UpdateRedirectUseCase as UseCaseAbstraction, UpdateRedirectRepository } from "./abstractions.js";
3
3
  import { GetRedirectByIdUseCase } from "../../../features/redirects/GetRedirectById/index.js";
4
+ import { WbPermissions } from "../../../domain/permissions.js";
4
5
  declare class UpdateRedirectUseCaseImpl implements UseCaseAbstraction.Interface {
6
+ private permissions;
5
7
  private eventPublisher;
6
8
  private getRedirectById;
7
9
  private repository;
8
- constructor(eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: UpdateRedirectRepository.Interface);
10
+ constructor(permissions: WbPermissions.Interface, eventPublisher: EventPublisherAbstraction.Interface, getRedirectById: GetRedirectByIdUseCase.Interface, repository: UpdateRedirectRepository.Interface);
9
11
  execute(id: string, data: UseCaseAbstraction.UpdateData): UseCaseAbstraction.Return;
10
12
  }
11
13
  export declare const UpdateRedirectUseCase: typeof UpdateRedirectUseCaseImpl & {