@webiny/api-file-manager 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 (38) hide show
  1. package/features/file/CreateFile/CreateFileUseCase.d.ts +3 -3
  2. package/features/file/CreateFile/CreateFileUseCase.js +5 -7
  3. package/features/file/CreateFile/CreateFileUseCase.js.map +1 -1
  4. package/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.d.ts +3 -3
  5. package/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.js +5 -8
  6. package/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.js.map +1 -1
  7. package/features/file/DeleteFile/DeleteFileUseCase.d.ts +3 -3
  8. package/features/file/DeleteFile/DeleteFileUseCase.js +5 -8
  9. package/features/file/DeleteFile/DeleteFileUseCase.js.map +1 -1
  10. package/features/file/GetFile/GetFileUseCase.d.ts +3 -3
  11. package/features/file/GetFile/GetFileUseCase.js +6 -14
  12. package/features/file/GetFile/GetFileUseCase.js.map +1 -1
  13. package/features/file/ListFiles/ListFilesUseCase.d.ts +4 -4
  14. package/features/file/ListFiles/ListFilesUseCase.js +9 -12
  15. package/features/file/ListFiles/ListFilesUseCase.js.map +1 -1
  16. package/features/file/ListTags/ListTagsUseCase.d.ts +3 -3
  17. package/features/file/ListTags/ListTagsUseCase.js +5 -6
  18. package/features/file/ListTags/ListTagsUseCase.js.map +1 -1
  19. package/features/file/UpdateFile/UpdateFileUseCase.d.ts +4 -4
  20. package/features/file/UpdateFile/UpdateFileUseCase.js +14 -17
  21. package/features/file/UpdateFile/UpdateFileUseCase.js.map +1 -1
  22. package/features/shared/abstractions.d.ts +1 -13
  23. package/features/shared/abstractions.js +1 -3
  24. package/features/shared/abstractions.js.map +1 -1
  25. package/index.js +2 -17
  26. package/index.js.map +1 -1
  27. package/package.json +15 -15
  28. package/permissions/schema.d.ts +73 -0
  29. package/permissions/schema.js +20 -0
  30. package/permissions/schema.js.map +1 -0
  31. package/types.d.ts +0 -3
  32. package/types.js.map +1 -1
  33. package/permissions/FilesPermissions.d.ts +0 -4
  34. package/permissions/FilesPermissions.js +0 -4
  35. package/permissions/FilesPermissions.js.map +0 -1
  36. package/permissions/SettingsPermissions.d.ts +0 -4
  37. package/permissions/SettingsPermissions.js +0 -4
  38. package/permissions/SettingsPermissions.js.map +0 -1
@@ -3,15 +3,15 @@ import { CreateFileUseCase as UseCaseAbstraction, CreateFileInput, CreateFileRep
3
3
  import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import type { File } from "../../../domain/file/types.js";
6
- import { FilePermissions } from "../../../features/shared/abstractions.js";
6
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
7
7
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
8
8
  declare class CreateFileUseCaseImpl implements UseCaseAbstraction.Interface {
9
9
  private identityContext;
10
- private filePermissions;
10
+ private permissions;
11
11
  private repository;
12
12
  private getSettings;
13
13
  private eventPublisher;
14
- constructor(identityContext: IdentityContext.Interface, filePermissions: FilePermissions.Interface, repository: CreateFileRepository.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface);
14
+ constructor(identityContext: IdentityContext.Interface, permissions: FmPermissions.Interface, repository: CreateFileRepository.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface);
15
15
  execute(input: CreateFileInput, meta?: Record<string, any>): Promise<Result<File, UseCaseAbstraction.Error>>;
16
16
  private validateInput;
17
17
  }
@@ -4,21 +4,19 @@ import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import { FileNotAuthorizedError, InvalidFileSizeError } from "../../../domain/file/errors.js";
6
6
  import { FileBeforeCreateEvent, FileAfterCreateEvent } from "./events.js";
7
- import { FilePermissions } from "../../shared/abstractions.js";
7
+ import { FmPermissions } from "../../shared/abstractions.js";
8
8
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
9
9
  import { Identity } from "../../../domain/identity/Identity.js";
10
10
  class CreateFileUseCaseImpl {
11
- constructor(identityContext, filePermissions, repository, getSettings, eventPublisher) {
11
+ constructor(identityContext, permissions, repository, getSettings, eventPublisher) {
12
12
  this.identityContext = identityContext;
13
- this.filePermissions = filePermissions;
13
+ this.permissions = permissions;
14
14
  this.repository = repository;
15
15
  this.getSettings = getSettings;
16
16
  this.eventPublisher = eventPublisher;
17
17
  }
18
18
  async execute(input, meta) {
19
- const hasPermission = await this.filePermissions.ensure({
20
- rwd: "w"
21
- });
19
+ const hasPermission = await this.permissions.canCreate("file");
22
20
  if (!hasPermission) {
23
21
  return Result.fail(new FileNotAuthorizedError());
24
22
  }
@@ -85,7 +83,7 @@ class CreateFileUseCaseImpl {
85
83
  }
86
84
  export const CreateFileUseCase = UseCaseAbstraction.createImplementation({
87
85
  implementation: CreateFileUseCaseImpl,
88
- dependencies: [IdentityContext, FilePermissions, CreateFileRepository, GetSettingsUseCase, EventPublisher]
86
+ dependencies: [IdentityContext, FmPermissions.Abstraction, CreateFileRepository, GetSettingsUseCase, EventPublisher]
89
87
  });
90
88
 
91
89
  //# sourceMappingURL=CreateFileUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","CreateFileUseCase","UseCaseAbstraction","CreateFileRepository","GetSettingsUseCase","EventPublisher","FileNotAuthorizedError","InvalidFileSizeError","FileBeforeCreateEvent","FileAfterCreateEvent","FilePermissions","IdentityContext","Identity","CreateFileUseCaseImpl","constructor","identityContext","filePermissions","repository","getSettings","eventPublisher","execute","input","meta","hasPermission","ensure","rwd","fail","validationResult","validateInput","isFail","error","id","key","split","currentIdentity","getIdentity","fileInput","name","size","type","metadata","location","folderId","tags","extensions","createdOn","modifiedOn","savedOn","createdBy","from","modifiedBy","undefined","savedBy","publish","file","result","value","ok","settingsResult","settings","uploadMinFileSize","uploadMaxFileSize","minSize","maxSize","createImplementation","implementation","dependencies"],"sources":["CreateFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n CreateFileUseCase as UseCaseAbstraction,\n CreateFileInput,\n CreateFileRepository\n} from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../../settings/GetSettings/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError, InvalidFileSizeError } from \"~/domain/file/errors.js\";\nimport { FileBeforeCreateEvent, FileAfterCreateEvent } from \"./events.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Identity } from \"~/domain/identity/Identity.js\";\n\nclass CreateFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private filePermissions: FilePermissions.Interface,\n private repository: CreateFileRepository.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): Promise<Result<File, UseCaseAbstraction.Error>> {\n const hasPermission = await this.filePermissions.ensure({ rwd: \"w\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const validationResult = await this.validateInput(input);\n if (validationResult.isFail()) {\n return Result.fail(validationResult.error);\n }\n\n const [id] = input.key.split(\"/\");\n const currentIdentity = this.identityContext.getIdentity();\n\n // Prepare file input\n const fileInput: FileInput = {\n id: input.id || id,\n key: input.key,\n name: input.name,\n size: input.size,\n type: input.type,\n metadata: input.metadata || {},\n location: input.location || { folderId: \"root\" },\n tags: input.tags || [],\n extensions: meta || {},\n // system attributes\n createdOn: input.createdOn,\n modifiedOn: input.modifiedOn,\n savedOn: input.savedOn,\n createdBy: input.createdBy\n ? Identity.from(input.createdBy)\n : Identity.from(currentIdentity),\n modifiedBy: input.modifiedBy ? Identity.from(input.modifiedBy) : undefined,\n savedBy: input.savedBy ? Identity.from(input.savedBy) : Identity.from(currentIdentity)\n };\n\n await this.eventPublisher.publish(new FileBeforeCreateEvent({ file: fileInput, meta }));\n\n const result = await this.repository.execute(fileInput);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterCreateEvent({ file: result.value, meta }));\n\n return Result.ok(result.value);\n }\n\n private async validateInput(\n input: CreateFileInput\n ): Promise<Result<void, InvalidFileSizeError>> {\n const settingsResult = await this.getSettings.execute();\n\n if (settingsResult.isFail()) {\n return Result.ok();\n }\n\n const settings = settingsResult.value;\n\n if (settings) {\n // Validate file size\n if (\n input.size < settings.uploadMinFileSize ||\n input.size > settings.uploadMaxFileSize\n ) {\n return Result.fail(\n new InvalidFileSizeError({\n size: input.size,\n minSize: settings.uploadMinFileSize,\n maxSize: settings.uploadMaxFileSize\n })\n );\n }\n }\n\n return Result.ok();\n }\n}\n\nexport const CreateFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateFileUseCaseImpl,\n dependencies: [\n IdentityContext,\n FilePermissions,\n CreateFileRepository,\n GetSettingsUseCase,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","CreateFileUseCase","UseCaseAbstraction","CreateFileRepository","GetSettingsUseCase","EventPublisher","FileNotAuthorizedError","InvalidFileSizeError","FileBeforeCreateEvent","FileAfterCreateEvent","FmPermissions","IdentityContext","Identity","CreateFileUseCaseImpl","constructor","identityContext","permissions","repository","getSettings","eventPublisher","execute","input","meta","hasPermission","canCreate","fail","validationResult","validateInput","isFail","error","id","key","split","currentIdentity","getIdentity","fileInput","name","size","type","metadata","location","folderId","tags","extensions","createdOn","modifiedOn","savedOn","createdBy","from","modifiedBy","undefined","savedBy","publish","file","result","value","ok","settingsResult","settings","uploadMinFileSize","uploadMaxFileSize","minSize","maxSize","createImplementation","implementation","dependencies","Abstraction"],"sources":["CreateFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n CreateFileUseCase as UseCaseAbstraction,\n CreateFileInput,\n CreateFileRepository\n} from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../../settings/GetSettings/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError, InvalidFileSizeError } from \"~/domain/file/errors.js\";\nimport { FileBeforeCreateEvent, FileAfterCreateEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Identity } from \"~/domain/identity/Identity.js\";\n\nclass CreateFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private permissions: FmPermissions.Interface,\n private repository: CreateFileRepository.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): Promise<Result<File, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canCreate(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const validationResult = await this.validateInput(input);\n if (validationResult.isFail()) {\n return Result.fail(validationResult.error);\n }\n\n const [id] = input.key.split(\"/\");\n const currentIdentity = this.identityContext.getIdentity();\n\n // Prepare file input\n const fileInput: FileInput = {\n id: input.id || id,\n key: input.key,\n name: input.name,\n size: input.size,\n type: input.type,\n metadata: input.metadata || {},\n location: input.location || { folderId: \"root\" },\n tags: input.tags || [],\n extensions: meta || {},\n // system attributes\n createdOn: input.createdOn,\n modifiedOn: input.modifiedOn,\n savedOn: input.savedOn,\n createdBy: input.createdBy\n ? Identity.from(input.createdBy)\n : Identity.from(currentIdentity),\n modifiedBy: input.modifiedBy ? Identity.from(input.modifiedBy) : undefined,\n savedBy: input.savedBy ? Identity.from(input.savedBy) : Identity.from(currentIdentity)\n };\n\n await this.eventPublisher.publish(new FileBeforeCreateEvent({ file: fileInput, meta }));\n\n const result = await this.repository.execute(fileInput);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterCreateEvent({ file: result.value, meta }));\n\n return Result.ok(result.value);\n }\n\n private async validateInput(\n input: CreateFileInput\n ): Promise<Result<void, InvalidFileSizeError>> {\n const settingsResult = await this.getSettings.execute();\n\n if (settingsResult.isFail()) {\n return Result.ok();\n }\n\n const settings = settingsResult.value;\n\n if (settings) {\n // Validate file size\n if (\n input.size < settings.uploadMinFileSize ||\n input.size > settings.uploadMaxFileSize\n ) {\n return Result.fail(\n new InvalidFileSizeError({\n size: input.size,\n minSize: settings.uploadMinFileSize,\n maxSize: settings.uploadMaxFileSize\n })\n );\n }\n }\n\n return Result.ok();\n }\n}\n\nexport const CreateFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateFileUseCaseImpl,\n dependencies: [\n IdentityContext,\n FmPermissions.Abstraction,\n CreateFileRepository,\n GetSettingsUseCase,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -3,13 +3,13 @@ import { CreateFilesInBatchUseCase as UseCaseAbstraction, CreateFilesInBatchInpu
3
3
  import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import type { File } from "../../../domain/file/types.js";
6
- import { FilePermissions } from "../../../features/shared/abstractions.js";
6
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
7
7
  declare class CreateFilesInBatchUseCaseImpl implements UseCaseAbstraction.Interface {
8
- private filePermissions;
8
+ private permissions;
9
9
  private repository;
10
10
  private getSettings;
11
11
  private eventPublisher;
12
- constructor(filePermissions: FilePermissions.Interface, repository: CreateFilesInBatchRepository.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface);
12
+ constructor(permissions: FmPermissions.Interface, repository: CreateFilesInBatchRepository.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface);
13
13
  execute(input: CreateFilesInBatchInput): Promise<Result<File[], UseCaseAbstraction.Error>>;
14
14
  private validateInput;
15
15
  }
@@ -4,19 +4,16 @@ import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import { FileNotAuthorizedError, InvalidFileSizeError } from "../../../domain/file/errors.js";
6
6
  import { FileBeforeBatchCreateEvent, FileAfterBatchCreateEvent } from "./events.js";
7
- import { FilePermissions } from "../../shared/abstractions.js";
7
+ import { FmPermissions } from "../../shared/abstractions.js";
8
8
  class CreateFilesInBatchUseCaseImpl {
9
- constructor(filePermissions, repository, getSettings, eventPublisher) {
10
- this.filePermissions = filePermissions;
9
+ constructor(permissions, repository, getSettings, eventPublisher) {
10
+ this.permissions = permissions;
11
11
  this.repository = repository;
12
12
  this.getSettings = getSettings;
13
13
  this.eventPublisher = eventPublisher;
14
14
  }
15
15
  async execute(input) {
16
- // Check write permission
17
- const hasPermission = await this.filePermissions.ensure({
18
- rwd: "w"
19
- });
16
+ const hasPermission = await this.permissions.canCreate("file");
20
17
  if (!hasPermission) {
21
18
  return Result.fail(new FileNotAuthorizedError());
22
19
  }
@@ -81,7 +78,7 @@ class CreateFilesInBatchUseCaseImpl {
81
78
  }
82
79
  export const CreateFilesInBatchUseCase = UseCaseAbstraction.createImplementation({
83
80
  implementation: CreateFilesInBatchUseCaseImpl,
84
- dependencies: [FilePermissions, CreateFilesInBatchRepository, GetSettingsUseCase, EventPublisher]
81
+ dependencies: [FmPermissions.Abstraction, CreateFilesInBatchRepository, GetSettingsUseCase, EventPublisher]
85
82
  });
86
83
 
87
84
  //# sourceMappingURL=CreateFilesInBatchUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","CreateFilesInBatchUseCase","UseCaseAbstraction","CreateFilesInBatchRepository","GetSettingsUseCase","EventPublisher","FileNotAuthorizedError","InvalidFileSizeError","FileBeforeBatchCreateEvent","FileAfterBatchCreateEvent","FilePermissions","CreateFilesInBatchUseCaseImpl","constructor","filePermissions","repository","getSettings","eventPublisher","execute","input","hasPermission","ensure","rwd","fail","validationResult","validateInput","files","isFail","error","fileInputs","map","file","id","key","split","name","size","type","metadata","location","folderId","tags","extensions","meta","publish","result","createBatch","value","ok","settingsResult","settings","uploadMinFileSize","uploadMaxFileSize","minSize","maxSize","createImplementation","implementation","dependencies"],"sources":["CreateFilesInBatchUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n CreateFilesInBatchUseCase as UseCaseAbstraction,\n CreateFilesInBatchInput,\n CreateFilesInBatchRepository\n} from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../../settings/GetSettings/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError, InvalidFileSizeError } from \"~/domain/file/errors.js\";\nimport { FileBeforeBatchCreateEvent, FileAfterBatchCreateEvent } from \"./events.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\nimport { CreateFileInput } from \"~/features/file/CreateFile/abstractions.js\";\n\nclass CreateFilesInBatchUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private filePermissions: FilePermissions.Interface,\n private repository: CreateFilesInBatchRepository.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n public async execute(\n input: CreateFilesInBatchInput\n ): Promise<Result<File[], UseCaseAbstraction.Error>> {\n // Check write permission\n const hasPermission = await this.filePermissions.ensure({ rwd: \"w\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Validate all files\n const validationResult = await this.validateInput(input.files);\n if (validationResult.isFail()) {\n return Result.fail(validationResult.error);\n }\n\n // Prepare file inputs with defaults\n const fileInputs: FileInput[] = input.files.map(file => {\n const [id] = file.key.split(\"/\");\n return {\n id: file.id || id,\n key: file.key,\n name: file.name,\n size: file.size,\n type: file.type,\n metadata: file.metadata || {},\n location: file.location || { folderId: \"root\" },\n tags: file.tags || [],\n extensions: input.meta || {}\n };\n });\n\n await this.eventPublisher.publish(\n new FileBeforeBatchCreateEvent({ files: fileInputs, meta: input.meta })\n );\n\n const result = await this.repository.createBatch(fileInputs);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new FileAfterBatchCreateEvent({ files: result.value, meta: input.meta })\n );\n\n return Result.ok(result.value);\n }\n\n private async validateInput(\n files: CreateFileInput[]\n ): Promise<Result<void, InvalidFileSizeError>> {\n const settingsResult = await this.getSettings.execute();\n\n if (settingsResult.isFail()) {\n return Result.ok();\n }\n\n const settings = settingsResult.value;\n\n if (settings) {\n for (const input of files) {\n // Validate file size\n if (\n input.size < settings.uploadMinFileSize ||\n input.size > settings.uploadMaxFileSize\n ) {\n return Result.fail(\n new InvalidFileSizeError({\n size: input.size,\n minSize: settings.uploadMinFileSize,\n maxSize: settings.uploadMaxFileSize\n })\n );\n }\n }\n }\n\n return Result.ok();\n }\n}\n\nexport const CreateFilesInBatchUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateFilesInBatchUseCaseImpl,\n dependencies: [\n FilePermissions,\n CreateFilesInBatchRepository,\n GetSettingsUseCase,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","CreateFilesInBatchUseCase","UseCaseAbstraction","CreateFilesInBatchRepository","GetSettingsUseCase","EventPublisher","FileNotAuthorizedError","InvalidFileSizeError","FileBeforeBatchCreateEvent","FileAfterBatchCreateEvent","FmPermissions","CreateFilesInBatchUseCaseImpl","constructor","permissions","repository","getSettings","eventPublisher","execute","input","hasPermission","canCreate","fail","validationResult","validateInput","files","isFail","error","fileInputs","map","file","id","key","split","name","size","type","metadata","location","folderId","tags","extensions","meta","publish","result","createBatch","value","ok","settingsResult","settings","uploadMinFileSize","uploadMaxFileSize","minSize","maxSize","createImplementation","implementation","dependencies","Abstraction"],"sources":["CreateFilesInBatchUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n CreateFilesInBatchUseCase as UseCaseAbstraction,\n CreateFilesInBatchInput,\n CreateFilesInBatchRepository\n} from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../../settings/GetSettings/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError, InvalidFileSizeError } from \"~/domain/file/errors.js\";\nimport { FileBeforeBatchCreateEvent, FileAfterBatchCreateEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\nimport { CreateFileInput } from \"~/features/file/CreateFile/abstractions.js\";\n\nclass CreateFilesInBatchUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private permissions: FmPermissions.Interface,\n private repository: CreateFilesInBatchRepository.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n public async execute(\n input: CreateFilesInBatchInput\n ): Promise<Result<File[], UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canCreate(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Validate all files\n const validationResult = await this.validateInput(input.files);\n if (validationResult.isFail()) {\n return Result.fail(validationResult.error);\n }\n\n // Prepare file inputs with defaults\n const fileInputs: FileInput[] = input.files.map(file => {\n const [id] = file.key.split(\"/\");\n return {\n id: file.id || id,\n key: file.key,\n name: file.name,\n size: file.size,\n type: file.type,\n metadata: file.metadata || {},\n location: file.location || { folderId: \"root\" },\n tags: file.tags || [],\n extensions: input.meta || {}\n };\n });\n\n await this.eventPublisher.publish(\n new FileBeforeBatchCreateEvent({ files: fileInputs, meta: input.meta })\n );\n\n const result = await this.repository.createBatch(fileInputs);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new FileAfterBatchCreateEvent({ files: result.value, meta: input.meta })\n );\n\n return Result.ok(result.value);\n }\n\n private async validateInput(\n files: CreateFileInput[]\n ): Promise<Result<void, InvalidFileSizeError>> {\n const settingsResult = await this.getSettings.execute();\n\n if (settingsResult.isFail()) {\n return Result.ok();\n }\n\n const settings = settingsResult.value;\n\n if (settings) {\n for (const input of files) {\n // Validate file size\n if (\n input.size < settings.uploadMinFileSize ||\n input.size > settings.uploadMaxFileSize\n ) {\n return Result.fail(\n new InvalidFileSizeError({\n size: input.size,\n minSize: settings.uploadMinFileSize,\n maxSize: settings.uploadMaxFileSize\n })\n );\n }\n }\n }\n\n return Result.ok();\n }\n}\n\nexport const CreateFilesInBatchUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateFilesInBatchUseCaseImpl,\n dependencies: [\n FmPermissions.Abstraction,\n CreateFilesInBatchRepository,\n GetSettingsUseCase,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -2,13 +2,13 @@ import { Result } from "@webiny/feature/api";
2
2
  import { DeleteFileUseCase as UseCaseAbstraction, DeleteFileRepository } from "./abstractions.js";
3
3
  import { GetFileUseCase } from "../GetFile/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
- import { FilePermissions } from "../../../features/shared/abstractions.js";
5
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
6
6
  declare class DeleteFileUseCaseImpl implements UseCaseAbstraction.Interface {
7
- private filePermissions;
7
+ private permissions;
8
8
  private getFile;
9
9
  private repository;
10
10
  private eventPublisher;
11
- constructor(filePermissions: FilePermissions.Interface, getFile: GetFileUseCase.Interface, repository: DeleteFileRepository.Interface, eventPublisher: EventPublisher.Interface);
11
+ constructor(permissions: FmPermissions.Interface, getFile: GetFileUseCase.Interface, repository: DeleteFileRepository.Interface, eventPublisher: EventPublisher.Interface);
12
12
  execute(id: string): Promise<Result<void, UseCaseAbstraction.Error>>;
13
13
  }
14
14
  export declare const DeleteFileUseCase: typeof DeleteFileUseCaseImpl & {
@@ -4,19 +4,16 @@ import { GetFileUseCase } from "../GetFile/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
6
6
  import { FileBeforeDeleteEvent, FileAfterDeleteEvent } from "./events.js";
7
- import { FilePermissions } from "../../shared/abstractions.js";
7
+ import { FmPermissions } from "../../shared/abstractions.js";
8
8
  class DeleteFileUseCaseImpl {
9
- constructor(filePermissions, getFile, repository, eventPublisher) {
10
- this.filePermissions = filePermissions;
9
+ constructor(permissions, getFile, repository, eventPublisher) {
10
+ this.permissions = permissions;
11
11
  this.getFile = getFile;
12
12
  this.repository = repository;
13
13
  this.eventPublisher = eventPublisher;
14
14
  }
15
15
  async execute(id) {
16
- // Check delete permission
17
- const hasPermission = await this.filePermissions.ensure({
18
- rwd: "d"
19
- });
16
+ const hasPermission = await this.permissions.canDelete("file");
20
17
  if (!hasPermission) {
21
18
  return Result.fail(new FileNotAuthorizedError());
22
19
  }
@@ -42,7 +39,7 @@ class DeleteFileUseCaseImpl {
42
39
  }
43
40
  export const DeleteFileUseCase = UseCaseAbstraction.createImplementation({
44
41
  implementation: DeleteFileUseCaseImpl,
45
- dependencies: [FilePermissions, GetFileUseCase, DeleteFileRepository, EventPublisher]
42
+ dependencies: [FmPermissions.Abstraction, GetFileUseCase, DeleteFileRepository, EventPublisher]
46
43
  });
47
44
 
48
45
  //# sourceMappingURL=DeleteFileUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","DeleteFileUseCase","UseCaseAbstraction","DeleteFileRepository","GetFileUseCase","EventPublisher","FileNotAuthorizedError","FileBeforeDeleteEvent","FileAfterDeleteEvent","FilePermissions","DeleteFileUseCaseImpl","constructor","filePermissions","getFile","repository","eventPublisher","execute","id","hasPermission","ensure","rwd","fail","getResult","isFail","error","file","value","publish","result","delete","ok","createImplementation","implementation","dependencies"],"sources":["DeleteFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteFileUseCase as UseCaseAbstraction, DeleteFileRepository } from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../GetFile/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FileBeforeDeleteEvent, FileAfterDeleteEvent } from \"./events.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\n\nclass DeleteFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private filePermissions: FilePermissions.Interface,\n private getFile: GetFileUseCase.Interface,\n private repository: DeleteFileRepository.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(id: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n // Check delete permission\n const hasPermission = await this.filePermissions.ensure({ rwd: \"d\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Get file (includes ownership check)\n const getResult = await this.getFile.execute(id);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const file = getResult.value;\n\n await this.eventPublisher.publish(new FileBeforeDeleteEvent({ file }));\n\n const result = await this.repository.delete(file);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterDeleteEvent({ file }));\n\n return Result.ok();\n }\n}\n\nexport const DeleteFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: DeleteFileUseCaseImpl,\n dependencies: [FilePermissions, GetFileUseCase, DeleteFileRepository, EventPublisher]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,iBAAiB,IAAIC,kBAAkB,EAAEC,oBAAoB;AACtE,SAASC,cAAc;AACvB,SAASC,cAAc,QAAQ,0CAA0C;AACzE,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB,EAAEC,oBAAoB;AACpD,SAASC,eAAe;AAExB,MAAMC,qBAAqB,CAAyC;EAChEC,WAAWA,CACCC,eAA0C,EAC1CC,OAAiC,EACjCC,UAA0C,EAC1CC,cAAwC,EAClD;IAAA,KAJUH,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,OAAiC,GAAjCA,OAAiC;IAAA,KACjCC,UAA0C,GAA1CA,UAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;EACjD;EAEH,MAAMC,OAAOA,CAACC,EAAU,EAAmD;IACvE;IACA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACN,eAAe,CAACO,MAAM,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACrE,IAAI,CAACF,aAAa,EAAE;MAChB,OAAOlB,MAAM,CAACqB,IAAI,CAAC,IAAIf,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMgB,SAAS,GAAG,MAAM,IAAI,CAACT,OAAO,CAACG,OAAO,CAACC,EAAE,CAAC;IAChD,IAAIK,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOvB,MAAM,CAACqB,IAAI,CAACC,SAAS,CAACE,KAAK,CAAC;IACvC;IAEA,MAAMC,IAAI,GAAGH,SAAS,CAACI,KAAK;IAE5B,MAAM,IAAI,CAACX,cAAc,CAACY,OAAO,CAAC,IAAIpB,qBAAqB,CAAC;MAAEkB;IAAK,CAAC,CAAC,CAAC;IAEtE,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACd,UAAU,CAACe,MAAM,CAACJ,IAAI,CAAC;IAEjD,IAAIG,MAAM,CAACL,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOvB,MAAM,CAACqB,IAAI,CAACO,MAAM,CAACJ,KAAK,CAAC;IACpC;IAEA,MAAM,IAAI,CAACT,cAAc,CAACY,OAAO,CAAC,IAAInB,oBAAoB,CAAC;MAAEiB;IAAK,CAAC,CAAC,CAAC;IAErE,OAAOzB,MAAM,CAAC8B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAM7B,iBAAiB,GAAGC,kBAAkB,CAAC6B,oBAAoB,CAAC;EACrEC,cAAc,EAAEtB,qBAAqB;EACrCuB,YAAY,EAAE,CAACxB,eAAe,EAAEL,cAAc,EAAED,oBAAoB,EAAEE,cAAc;AACxF,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","DeleteFileUseCase","UseCaseAbstraction","DeleteFileRepository","GetFileUseCase","EventPublisher","FileNotAuthorizedError","FileBeforeDeleteEvent","FileAfterDeleteEvent","FmPermissions","DeleteFileUseCaseImpl","constructor","permissions","getFile","repository","eventPublisher","execute","id","hasPermission","canDelete","fail","getResult","isFail","error","file","value","publish","result","delete","ok","createImplementation","implementation","dependencies","Abstraction"],"sources":["DeleteFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteFileUseCase as UseCaseAbstraction, DeleteFileRepository } from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../GetFile/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FileBeforeDeleteEvent, FileAfterDeleteEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\n\nclass DeleteFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: FmPermissions.Interface,\n private getFile: GetFileUseCase.Interface,\n private repository: DeleteFileRepository.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(id: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canDelete(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Get file (includes ownership check)\n const getResult = await this.getFile.execute(id);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const file = getResult.value;\n\n await this.eventPublisher.publish(new FileBeforeDeleteEvent({ file }));\n\n const result = await this.repository.delete(file);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterDeleteEvent({ file }));\n\n return Result.ok();\n }\n}\n\nexport const DeleteFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: DeleteFileUseCaseImpl,\n dependencies: [FmPermissions.Abstraction, GetFileUseCase, DeleteFileRepository, EventPublisher]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,iBAAiB,IAAIC,kBAAkB,EAAEC,oBAAoB;AACtE,SAASC,cAAc;AACvB,SAASC,cAAc,QAAQ,0CAA0C;AACzE,SAASC,sBAAsB;AAC/B,SAASC,qBAAqB,EAAEC,oBAAoB;AACpD,SAASC,aAAa;AAEtB,MAAMC,qBAAqB,CAAyC;EAChEC,WAAWA,CACCC,WAAoC,EACpCC,OAAiC,EACjCC,UAA0C,EAC1CC,cAAwC,EAClD;IAAA,KAJUH,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,OAAiC,GAAjCA,OAAiC;IAAA,KACjCC,UAA0C,GAA1CA,UAA0C;IAAA,KAC1CC,cAAwC,GAAxCA,cAAwC;EACjD;EAEH,MAAMC,OAAOA,CAACC,EAAU,EAAmD;IACvE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACN,WAAW,CAACO,SAAS,CAAC,MAAM,CAAC;IAC9D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOlB,MAAM,CAACoB,IAAI,CAAC,IAAId,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMe,SAAS,GAAG,MAAM,IAAI,CAACR,OAAO,CAACG,OAAO,CAACC,EAAE,CAAC;IAChD,IAAII,SAAS,CAACC,MAAM,CAAC,CAAC,EAAE;MACpB,OAAOtB,MAAM,CAACoB,IAAI,CAACC,SAAS,CAACE,KAAK,CAAC;IACvC;IAEA,MAAMC,IAAI,GAAGH,SAAS,CAACI,KAAK;IAE5B,MAAM,IAAI,CAACV,cAAc,CAACW,OAAO,CAAC,IAAInB,qBAAqB,CAAC;MAAEiB;IAAK,CAAC,CAAC,CAAC;IAEtE,MAAMG,MAAM,GAAG,MAAM,IAAI,CAACb,UAAU,CAACc,MAAM,CAACJ,IAAI,CAAC;IAEjD,IAAIG,MAAM,CAACL,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOtB,MAAM,CAACoB,IAAI,CAACO,MAAM,CAACJ,KAAK,CAAC;IACpC;IAEA,MAAM,IAAI,CAACR,cAAc,CAACW,OAAO,CAAC,IAAIlB,oBAAoB,CAAC;MAAEgB;IAAK,CAAC,CAAC,CAAC;IAErE,OAAOxB,MAAM,CAAC6B,EAAE,CAAC,CAAC;EACtB;AACJ;AAEA,OAAO,MAAM5B,iBAAiB,GAAGC,kBAAkB,CAAC4B,oBAAoB,CAAC;EACrEC,cAAc,EAAErB,qBAAqB;EACrCsB,YAAY,EAAE,CAACvB,aAAa,CAACwB,WAAW,EAAE7B,cAAc,EAAED,oBAAoB,EAAEE,cAAc;AAClG,CAAC,CAAC","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetFileUseCase as UseCaseAbstraction, GetFileRepository } from "./abstractions.js";
3
3
  import type { File } from "../../../domain/file/types.js";
4
- import { FilePermissions } from "../../../features/shared/abstractions.js";
4
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
5
5
  declare class GetFileUseCaseImpl implements UseCaseAbstraction.Interface {
6
- private filePermissions;
6
+ private permissions;
7
7
  private repository;
8
- constructor(filePermissions: FilePermissions.Interface, repository: GetFileRepository.Interface);
8
+ constructor(permissions: FmPermissions.Interface, repository: GetFileRepository.Interface);
9
9
  execute(id: string): Promise<Result<File, UseCaseAbstraction.Error>>;
10
10
  }
11
11
  export declare const GetFileUseCase: typeof GetFileUseCaseImpl & {
@@ -1,17 +1,14 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetFileUseCase as UseCaseAbstraction, GetFileRepository } from "./abstractions.js";
3
3
  import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
4
- import { FilePermissions } from "../../shared/abstractions.js";
4
+ import { FmPermissions } from "../../shared/abstractions.js";
5
5
  class GetFileUseCaseImpl {
6
- constructor(filePermissions, repository) {
7
- this.filePermissions = filePermissions;
6
+ constructor(permissions, repository) {
7
+ this.permissions = permissions;
8
8
  this.repository = repository;
9
9
  }
10
10
  async execute(id) {
11
- // Check read permission
12
- const hasPermission = await this.filePermissions.ensure({
13
- rwd: "r"
14
- });
11
+ const hasPermission = await this.permissions.canRead("file");
15
12
  if (!hasPermission) {
16
13
  return Result.fail(new FileNotAuthorizedError());
17
14
  }
@@ -20,12 +17,7 @@ class GetFileUseCaseImpl {
20
17
  return Result.fail(result.error);
21
18
  }
22
19
  const file = result.value;
23
-
24
- // Check ownership permission
25
- const hasOwnershipPermission = await this.filePermissions.ensure({
26
- owns: file.createdBy
27
- });
28
- if (!hasOwnershipPermission) {
20
+ if (!(await this.permissions.canAccess("file", file))) {
29
21
  return Result.fail(new FileNotAuthorizedError());
30
22
  }
31
23
  return Result.ok(file);
@@ -33,7 +25,7 @@ class GetFileUseCaseImpl {
33
25
  }
34
26
  export const GetFileUseCase = UseCaseAbstraction.createImplementation({
35
27
  implementation: GetFileUseCaseImpl,
36
- dependencies: [FilePermissions, GetFileRepository]
28
+ dependencies: [FmPermissions.Abstraction, GetFileRepository]
37
29
  });
38
30
 
39
31
  //# sourceMappingURL=GetFileUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","GetFileUseCase","UseCaseAbstraction","GetFileRepository","FileNotAuthorizedError","FilePermissions","GetFileUseCaseImpl","constructor","filePermissions","repository","execute","id","hasPermission","ensure","rwd","fail","result","isFail","error","file","value","hasOwnershipPermission","owns","createdBy","ok","createImplementation","implementation","dependencies"],"sources":["GetFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetFileUseCase as UseCaseAbstraction, GetFileRepository } from \"./abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\n\nclass GetFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private filePermissions: FilePermissions.Interface,\n private repository: GetFileRepository.Interface\n ) {}\n\n async execute(id: string): Promise<Result<File, UseCaseAbstraction.Error>> {\n // Check read permission\n const hasPermission = await this.filePermissions.ensure({ rwd: \"r\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const result = await this.repository.execute(id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const file = result.value;\n\n // Check ownership permission\n const hasOwnershipPermission = await this.filePermissions.ensure({ owns: file.createdBy });\n if (!hasOwnershipPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n return Result.ok(file);\n }\n}\n\nexport const GetFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetFileUseCaseImpl,\n dependencies: [FilePermissions, GetFileRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,cAAc,IAAIC,kBAAkB,EAAEC,iBAAiB;AAEhE,SAASC,sBAAsB;AAC/B,SAASC,eAAe;AAExB,MAAMC,kBAAkB,CAAyC;EAC7DC,WAAWA,CACCC,eAA0C,EAC1CC,UAAuC,EACjD;IAAA,KAFUD,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAAuC,GAAvCA,UAAuC;EAChD;EAEH,MAAMC,OAAOA,CAACC,EAAU,EAAmD;IACvE;IACA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACK,MAAM,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACrE,IAAI,CAACF,aAAa,EAAE;MAChB,OAAOZ,MAAM,CAACe,IAAI,CAAC,IAAIX,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,MAAMY,MAAM,GAAG,MAAM,IAAI,CAACP,UAAU,CAACC,OAAO,CAACC,EAAE,CAAC;IAEhD,IAAIK,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOjB,MAAM,CAACe,IAAI,CAACC,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,MAAMC,IAAI,GAAGH,MAAM,CAACI,KAAK;;IAEzB;IACA,MAAMC,sBAAsB,GAAG,MAAM,IAAI,CAACb,eAAe,CAACK,MAAM,CAAC;MAAES,IAAI,EAAEH,IAAI,CAACI;IAAU,CAAC,CAAC;IAC1F,IAAI,CAACF,sBAAsB,EAAE;MACzB,OAAOrB,MAAM,CAACe,IAAI,CAAC,IAAIX,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,OAAOJ,MAAM,CAACwB,EAAE,CAACL,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMlB,cAAc,GAAGC,kBAAkB,CAACuB,oBAAoB,CAAC;EAClEC,cAAc,EAAEpB,kBAAkB;EAClCqB,YAAY,EAAE,CAACtB,eAAe,EAAEF,iBAAiB;AACrD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","GetFileUseCase","UseCaseAbstraction","GetFileRepository","FileNotAuthorizedError","FmPermissions","GetFileUseCaseImpl","constructor","permissions","repository","execute","id","hasPermission","canRead","fail","result","isFail","error","file","value","canAccess","ok","createImplementation","implementation","dependencies","Abstraction"],"sources":["GetFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetFileUseCase as UseCaseAbstraction, GetFileRepository } from \"./abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\n\nclass GetFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: FmPermissions.Interface,\n private repository: GetFileRepository.Interface\n ) {}\n\n async execute(id: string): Promise<Result<File, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canRead(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const result = await this.repository.execute(id);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n const file = result.value;\n\n if (!(await this.permissions.canAccess(\"file\", file))) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n return Result.ok(file);\n }\n}\n\nexport const GetFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetFileUseCaseImpl,\n dependencies: [FmPermissions.Abstraction, GetFileRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,cAAc,IAAIC,kBAAkB,EAAEC,iBAAiB;AAEhE,SAASC,sBAAsB;AAC/B,SAASC,aAAa;AAEtB,MAAMC,kBAAkB,CAAyC;EAC7DC,WAAWA,CACCC,WAAoC,EACpCC,UAAuC,EACjD;IAAA,KAFUD,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,UAAuC,GAAvCA,UAAuC;EAChD;EAEH,MAAMC,OAAOA,CAACC,EAAU,EAAmD;IACvE,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACJ,WAAW,CAACK,OAAO,CAAC,MAAM,CAAC;IAC5D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOZ,MAAM,CAACc,IAAI,CAAC,IAAIV,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,MAAMW,MAAM,GAAG,MAAM,IAAI,CAACN,UAAU,CAACC,OAAO,CAACC,EAAE,CAAC;IAEhD,IAAII,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOhB,MAAM,CAACc,IAAI,CAACC,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,MAAMC,IAAI,GAAGH,MAAM,CAACI,KAAK;IAEzB,IAAI,EAAE,MAAM,IAAI,CAACX,WAAW,CAACY,SAAS,CAAC,MAAM,EAAEF,IAAI,CAAC,CAAC,EAAE;MACnD,OAAOlB,MAAM,CAACc,IAAI,CAAC,IAAIV,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,OAAOJ,MAAM,CAACqB,EAAE,CAACH,IAAI,CAAC;EAC1B;AACJ;AAEA,OAAO,MAAMjB,cAAc,GAAGC,kBAAkB,CAACoB,oBAAoB,CAAC;EAClEC,cAAc,EAAEjB,kBAAkB;EAClCkB,YAAY,EAAE,CAACnB,aAAa,CAACoB,WAAW,EAAEtB,iBAAiB;AAC/D,CAAC,CAAC","ignoreList":[]}
@@ -1,12 +1,12 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListFilesUseCase as UseCaseAbstraction, ListFilesInput, ListFilesOutput, ListFilesRepository } from "./abstractions.js";
3
- import { FilePermissions } from "../../../features/shared/abstractions.js";
4
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
3
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
5
  declare class ListFilesUseCaseImpl implements UseCaseAbstraction.Interface {
6
- private filePermissions;
6
+ private permissions;
7
7
  private identityContext;
8
8
  private repository;
9
- constructor(filePermissions: FilePermissions.Interface, identityContext: IdentityContext.Interface, repository: ListFilesRepository.Interface);
9
+ constructor(permissions: FmPermissions.Interface, identityContext: IdentityContext.Interface, repository: ListFilesRepository.Interface);
10
10
  execute(input: ListFilesInput): Promise<Result<ListFilesOutput, UseCaseAbstraction.Error>>;
11
11
  }
12
12
  export declare const ListFilesUseCase: typeof ListFilesUseCaseImpl & {
@@ -1,30 +1,27 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListFilesUseCase as UseCaseAbstraction, ListFilesRepository } from "./abstractions.js";
3
3
  import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
4
- import { FilePermissions } from "../../shared/abstractions.js";
5
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
4
+ import { FmPermissions } from "../../shared/abstractions.js";
5
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
6
6
  class ListFilesUseCaseImpl {
7
- constructor(filePermissions, identityContext, repository) {
8
- this.filePermissions = filePermissions;
7
+ constructor(permissions, identityContext, repository) {
8
+ this.permissions = permissions;
9
9
  this.identityContext = identityContext;
10
10
  this.repository = repository;
11
11
  }
12
12
  async execute(input) {
13
- // Check read permission
14
- const hasPermission = await this.filePermissions.ensure({
15
- rwd: "r"
16
- });
13
+ const hasPermission = await this.permissions.canRead("file");
17
14
  if (!hasPermission) {
18
15
  return Result.fail(new FileNotAuthorizedError());
19
16
  }
20
17
 
21
- // Build where clause
18
+ // Build where clause.
22
19
  const where = {
23
20
  ...(input.where || {})
24
21
  };
25
22
 
26
- // Filter by createdBy if user can only access own records
27
- if (await this.filePermissions.canAccessOnlyOwnRecords()) {
23
+ // Filter by createdBy if user can only access own records.
24
+ if (await this.permissions.onlyOwnRecords("file")) {
28
25
  const identity = this.identityContext.getIdentity();
29
26
  where.createdBy = identity.id;
30
27
  }
@@ -42,7 +39,7 @@ class ListFilesUseCaseImpl {
42
39
  }
43
40
  export const ListFilesUseCase = UseCaseAbstraction.createImplementation({
44
41
  implementation: ListFilesUseCaseImpl,
45
- dependencies: [FilePermissions, IdentityContext, ListFilesRepository]
42
+ dependencies: [FmPermissions.Abstraction, IdentityContext, ListFilesRepository]
46
43
  });
47
44
 
48
45
  //# sourceMappingURL=ListFilesUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","ListFilesUseCase","UseCaseAbstraction","ListFilesRepository","FileNotAuthorizedError","FilePermissions","IdentityContext","ListFilesUseCaseImpl","constructor","filePermissions","identityContext","repository","execute","input","hasPermission","ensure","rwd","fail","where","canAccessOnlyOwnRecords","identity","getIdentity","createdBy","id","result","limit","sort","length","isFail","error","ok","value","createImplementation","implementation","dependencies"],"sources":["ListFilesUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListFilesUseCase as UseCaseAbstraction,\n ListFilesInput,\n ListFilesOutput,\n ListFilesRepository\n} from \"./abstractions.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\n\nclass ListFilesUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private filePermissions: FilePermissions.Interface,\n private identityContext: IdentityContext.Interface,\n private repository: ListFilesRepository.Interface\n ) {}\n\n async execute(\n input: ListFilesInput\n ): Promise<Result<ListFilesOutput, UseCaseAbstraction.Error>> {\n // Check read permission\n const hasPermission = await this.filePermissions.ensure({ rwd: \"r\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Build where clause\n const where: ListFilesInput[\"where\"] = {\n ...(input.where || {})\n };\n\n // Filter by createdBy if user can only access own records\n if (await this.filePermissions.canAccessOnlyOwnRecords()) {\n const identity = this.identityContext.getIdentity();\n where.createdBy = identity.id;\n }\n\n const result = await this.repository.execute({\n ...input,\n where,\n limit: input.limit || 40,\n sort: input.sort && input.sort.length > 0 ? input.sort : [\"id_DESC\"]\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok(result.value);\n }\n}\n\nexport const ListFilesUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListFilesUseCaseImpl,\n dependencies: [FilePermissions, IdentityContext, ListFilesRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,gBAAgB,IAAIC,kBAAkB,EAGtCC,mBAAmB;AAEvB,SAASC,sBAAsB;AAC/B,SAASC,eAAe;AACxB,SAASC,eAAe,QAAQ,2CAA2C;AAE3E,MAAMC,oBAAoB,CAAyC;EAC/DC,WAAWA,CACCC,eAA0C,EAC1CC,eAA0C,EAC1CC,UAAyC,EACnD;IAAA,KAHUF,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAAyC,GAAzCA,UAAyC;EAClD;EAEH,MAAMC,OAAOA,CACTC,KAAqB,EACqC;IAC1D;IACA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACL,eAAe,CAACM,MAAM,CAAC;MAAEC,GAAG,EAAE;IAAI,CAAC,CAAC;IACrE,IAAI,CAACF,aAAa,EAAE;MAChB,OAAOd,MAAM,CAACiB,IAAI,CAAC,IAAIb,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMc,KAA8B,GAAG;MACnC,IAAIL,KAAK,CAACK,KAAK,IAAI,CAAC,CAAC;IACzB,CAAC;;IAED;IACA,IAAI,MAAM,IAAI,CAACT,eAAe,CAACU,uBAAuB,CAAC,CAAC,EAAE;MACtD,MAAMC,QAAQ,GAAG,IAAI,CAACV,eAAe,CAACW,WAAW,CAAC,CAAC;MACnDH,KAAK,CAACI,SAAS,GAAGF,QAAQ,CAACG,EAAE;IACjC;IAEA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACb,UAAU,CAACC,OAAO,CAAC;MACzC,GAAGC,KAAK;MACRK,KAAK;MACLO,KAAK,EAAEZ,KAAK,CAACY,KAAK,IAAI,EAAE;MACxBC,IAAI,EAAEb,KAAK,CAACa,IAAI,IAAIb,KAAK,CAACa,IAAI,CAACC,MAAM,GAAG,CAAC,GAAGd,KAAK,CAACa,IAAI,GAAG,CAAC,SAAS;IACvE,CAAC,CAAC;IAEF,IAAIF,MAAM,CAACI,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO5B,MAAM,CAACiB,IAAI,CAACO,MAAM,CAACK,KAAK,CAAC;IACpC;IAEA,OAAO7B,MAAM,CAAC8B,EAAE,CAACN,MAAM,CAACO,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAM9B,gBAAgB,GAAGC,kBAAkB,CAAC8B,oBAAoB,CAAC;EACpEC,cAAc,EAAE1B,oBAAoB;EACpC2B,YAAY,EAAE,CAAC7B,eAAe,EAAEC,eAAe,EAAEH,mBAAmB;AACxE,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","ListFilesUseCase","UseCaseAbstraction","ListFilesRepository","FileNotAuthorizedError","FmPermissions","IdentityContext","ListFilesUseCaseImpl","constructor","permissions","identityContext","repository","execute","input","hasPermission","canRead","fail","where","onlyOwnRecords","identity","getIdentity","createdBy","id","result","limit","sort","length","isFail","error","ok","value","createImplementation","implementation","dependencies","Abstraction"],"sources":["ListFilesUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListFilesUseCase as UseCaseAbstraction,\n ListFilesInput,\n ListFilesOutput,\n ListFilesRepository\n} from \"./abstractions.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nclass ListFilesUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: FmPermissions.Interface,\n private identityContext: IdentityContext.Interface,\n private repository: ListFilesRepository.Interface\n ) {}\n\n async execute(\n input: ListFilesInput\n ): Promise<Result<ListFilesOutput, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canRead(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Build where clause.\n const where: ListFilesInput[\"where\"] = {\n ...(input.where || {})\n };\n\n // Filter by createdBy if user can only access own records.\n if (await this.permissions.onlyOwnRecords(\"file\")) {\n const identity = this.identityContext.getIdentity();\n where.createdBy = identity.id;\n }\n\n const result = await this.repository.execute({\n ...input,\n where,\n limit: input.limit || 40,\n sort: input.sort && input.sort.length > 0 ? input.sort : [\"id_DESC\"]\n });\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok(result.value);\n }\n}\n\nexport const ListFilesUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListFilesUseCaseImpl,\n dependencies: [FmPermissions.Abstraction, IdentityContext, ListFilesRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,gBAAgB,IAAIC,kBAAkB,EAGtCC,mBAAmB;AAEvB,SAASC,sBAAsB;AAC/B,SAASC,aAAa;AACtB,SAASC,eAAe,QAAQ,6DAA6D;AAE7F,MAAMC,oBAAoB,CAAyC;EAC/DC,WAAWA,CACCC,WAAoC,EACpCC,eAA0C,EAC1CC,UAAyC,EACnD;IAAA,KAHUF,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAAyC,GAAzCA,UAAyC;EAClD;EAEH,MAAMC,OAAOA,CACTC,KAAqB,EACqC;IAC1D,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACL,WAAW,CAACM,OAAO,CAAC,MAAM,CAAC;IAC5D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOd,MAAM,CAACgB,IAAI,CAAC,IAAIZ,sBAAsB,CAAC,CAAC,CAAC;IACpD;;IAEA;IACA,MAAMa,KAA8B,GAAG;MACnC,IAAIJ,KAAK,CAACI,KAAK,IAAI,CAAC,CAAC;IACzB,CAAC;;IAED;IACA,IAAI,MAAM,IAAI,CAACR,WAAW,CAACS,cAAc,CAAC,MAAM,CAAC,EAAE;MAC/C,MAAMC,QAAQ,GAAG,IAAI,CAACT,eAAe,CAACU,WAAW,CAAC,CAAC;MACnDH,KAAK,CAACI,SAAS,GAAGF,QAAQ,CAACG,EAAE;IACjC;IAEA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACZ,UAAU,CAACC,OAAO,CAAC;MACzC,GAAGC,KAAK;MACRI,KAAK;MACLO,KAAK,EAAEX,KAAK,CAACW,KAAK,IAAI,EAAE;MACxBC,IAAI,EAAEZ,KAAK,CAACY,IAAI,IAAIZ,KAAK,CAACY,IAAI,CAACC,MAAM,GAAG,CAAC,GAAGb,KAAK,CAACY,IAAI,GAAG,CAAC,SAAS;IACvE,CAAC,CAAC;IAEF,IAAIF,MAAM,CAACI,MAAM,CAAC,CAAC,EAAE;MACjB,OAAO3B,MAAM,CAACgB,IAAI,CAACO,MAAM,CAACK,KAAK,CAAC;IACpC;IAEA,OAAO5B,MAAM,CAAC6B,EAAE,CAACN,MAAM,CAACO,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAM7B,gBAAgB,GAAGC,kBAAkB,CAAC6B,oBAAoB,CAAC;EACpEC,cAAc,EAAEzB,oBAAoB;EACpC0B,YAAY,EAAE,CAAC5B,aAAa,CAAC6B,WAAW,EAAE5B,eAAe,EAAEH,mBAAmB;AAClF,CAAC,CAAC","ignoreList":[]}
@@ -1,10 +1,10 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListTagsUseCase as UseCaseAbstraction, ListTagsInput, TagItem, ListTagsRepository } from "./abstractions.js";
3
- import { FilePermissions } from "../../../features/shared/abstractions.js";
3
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
4
4
  declare class ListTagsUseCaseImpl implements UseCaseAbstraction.Interface {
5
- private filePermissions;
5
+ private permissions;
6
6
  private repository;
7
- constructor(filePermissions: FilePermissions.Interface, repository: ListTagsRepository.Interface);
7
+ constructor(permissions: FmPermissions.Interface, repository: ListTagsRepository.Interface);
8
8
  execute(input: ListTagsInput): Promise<Result<TagItem[], UseCaseAbstraction.Error>>;
9
9
  }
10
10
  export declare const ListTagsUseCase: typeof ListTagsUseCaseImpl & {
@@ -1,15 +1,14 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListTagsUseCase as UseCaseAbstraction, ListTagsRepository } from "./abstractions.js";
3
3
  import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
4
- import { FilePermissions } from "../../shared/abstractions.js";
4
+ import { FmPermissions } from "../../shared/abstractions.js";
5
5
  class ListTagsUseCaseImpl {
6
- constructor(filePermissions, repository) {
7
- this.filePermissions = filePermissions;
6
+ constructor(permissions, repository) {
7
+ this.permissions = permissions;
8
8
  this.repository = repository;
9
9
  }
10
10
  async execute(input) {
11
- // Check permission (ensure() with no args checks basic access)
12
- const hasPermission = await this.filePermissions.ensure();
11
+ const hasPermission = await this.permissions.canAccess("file");
13
12
  if (!hasPermission) {
14
13
  return Result.fail(new FileNotAuthorizedError());
15
14
  }
@@ -26,7 +25,7 @@ class ListTagsUseCaseImpl {
26
25
  }
27
26
  export const ListTagsUseCase = UseCaseAbstraction.createImplementation({
28
27
  implementation: ListTagsUseCaseImpl,
29
- dependencies: [FilePermissions, ListTagsRepository]
28
+ dependencies: [FmPermissions.Abstraction, ListTagsRepository]
30
29
  });
31
30
 
32
31
  //# sourceMappingURL=ListTagsUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","ListTagsUseCase","UseCaseAbstraction","ListTagsRepository","FileNotAuthorizedError","FilePermissions","ListTagsUseCaseImpl","constructor","filePermissions","repository","execute","input","hasPermission","ensure","fail","enrichedInput","limit","result","isFail","error","ok","value","createImplementation","implementation","dependencies"],"sources":["ListTagsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListTagsUseCase as UseCaseAbstraction,\n ListTagsInput,\n TagItem,\n ListTagsRepository\n} from \"./abstractions.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\n\nclass ListTagsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private filePermissions: FilePermissions.Interface,\n private repository: ListTagsRepository.Interface\n ) {}\n\n async execute(input: ListTagsInput): Promise<Result<TagItem[], UseCaseAbstraction.Error>> {\n // Check permission (ensure() with no args checks basic access)\n const hasPermission = await this.filePermissions.ensure();\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const enrichedInput: ListTagsInput = {\n ...input,\n limit: input.limit || 1000000\n };\n\n const result = await this.repository.execute(enrichedInput);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok(result.value);\n }\n}\n\nexport const ListTagsUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListTagsUseCaseImpl,\n dependencies: [FilePermissions, ListTagsRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,eAAe,IAAIC,kBAAkB,EAGrCC,kBAAkB;AAEtB,SAASC,sBAAsB;AAC/B,SAASC,eAAe;AAExB,MAAMC,mBAAmB,CAAyC;EAC9DC,WAAWA,CACCC,eAA0C,EAC1CC,UAAwC,EAClD;IAAA,KAFUD,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,UAAwC,GAAxCA,UAAwC;EACjD;EAEH,MAAMC,OAAOA,CAACC,KAAoB,EAAwD;IACtF;IACA,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACJ,eAAe,CAACK,MAAM,CAAC,CAAC;IACzD,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOZ,MAAM,CAACc,IAAI,CAAC,IAAIV,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,MAAMW,aAA4B,GAAG;MACjC,GAAGJ,KAAK;MACRK,KAAK,EAAEL,KAAK,CAACK,KAAK,IAAI;IAC1B,CAAC;IAED,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACR,UAAU,CAACC,OAAO,CAACK,aAAa,CAAC;IAE3D,IAAIE,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOlB,MAAM,CAACc,IAAI,CAACG,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,OAAOnB,MAAM,CAACoB,EAAE,CAACH,MAAM,CAACI,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMpB,eAAe,GAAGC,kBAAkB,CAACoB,oBAAoB,CAAC;EACnEC,cAAc,EAAEjB,mBAAmB;EACnCkB,YAAY,EAAE,CAACnB,eAAe,EAAEF,kBAAkB;AACtD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["Result","ListTagsUseCase","UseCaseAbstraction","ListTagsRepository","FileNotAuthorizedError","FmPermissions","ListTagsUseCaseImpl","constructor","permissions","repository","execute","input","hasPermission","canAccess","fail","enrichedInput","limit","result","isFail","error","ok","value","createImplementation","implementation","dependencies","Abstraction"],"sources":["ListTagsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ListTagsUseCase as UseCaseAbstraction,\n ListTagsInput,\n TagItem,\n ListTagsRepository\n} from \"./abstractions.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\n\nclass ListTagsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: FmPermissions.Interface,\n private repository: ListTagsRepository.Interface\n ) {}\n\n async execute(input: ListTagsInput): Promise<Result<TagItem[], UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canAccess(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const enrichedInput: ListTagsInput = {\n ...input,\n limit: input.limit || 1000000\n };\n\n const result = await this.repository.execute(enrichedInput);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n return Result.ok(result.value);\n }\n}\n\nexport const ListTagsUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListTagsUseCaseImpl,\n dependencies: [FmPermissions.Abstraction, ListTagsRepository]\n});\n"],"mappings":"AAAA,SAASA,MAAM,QAAQ,qBAAqB;AAC5C,SACIC,eAAe,IAAIC,kBAAkB,EAGrCC,kBAAkB;AAEtB,SAASC,sBAAsB;AAC/B,SAASC,aAAa;AAEtB,MAAMC,mBAAmB,CAAyC;EAC9DC,WAAWA,CACCC,WAAoC,EACpCC,UAAwC,EAClD;IAAA,KAFUD,WAAoC,GAApCA,WAAoC;IAAA,KACpCC,UAAwC,GAAxCA,UAAwC;EACjD;EAEH,MAAMC,OAAOA,CAACC,KAAoB,EAAwD;IACtF,MAAMC,aAAa,GAAG,MAAM,IAAI,CAACJ,WAAW,CAACK,SAAS,CAAC,MAAM,CAAC;IAC9D,IAAI,CAACD,aAAa,EAAE;MAChB,OAAOZ,MAAM,CAACc,IAAI,CAAC,IAAIV,sBAAsB,CAAC,CAAC,CAAC;IACpD;IAEA,MAAMW,aAA4B,GAAG;MACjC,GAAGJ,KAAK;MACRK,KAAK,EAAEL,KAAK,CAACK,KAAK,IAAI;IAC1B,CAAC;IAED,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACR,UAAU,CAACC,OAAO,CAACK,aAAa,CAAC;IAE3D,IAAIE,MAAM,CAACC,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOlB,MAAM,CAACc,IAAI,CAACG,MAAM,CAACE,KAAK,CAAC;IACpC;IAEA,OAAOnB,MAAM,CAACoB,EAAE,CAACH,MAAM,CAACI,KAAK,CAAC;EAClC;AACJ;AAEA,OAAO,MAAMpB,eAAe,GAAGC,kBAAkB,CAACoB,oBAAoB,CAAC;EACnEC,cAAc,EAAEjB,mBAAmB;EACnCkB,YAAY,EAAE,CAACnB,aAAa,CAACoB,WAAW,EAAEtB,kBAAkB;AAChE,CAAC,CAAC","ignoreList":[]}
@@ -3,15 +3,15 @@ import { UpdateFileUseCase as UseCaseAbstraction, UpdateFileInput, UpdateFileRep
3
3
  import { GetFileUseCase } from "../GetFile/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import type { File } from "../../../domain/file/types.js";
6
- import { FilePermissions } from "../../../features/shared/abstractions.js";
7
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
6
+ import { FmPermissions } from "../../../features/shared/abstractions.js";
7
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
8
8
  declare class UpdateFileUseCaseImpl implements UseCaseAbstraction.Interface {
9
9
  private identityContext;
10
- private filePermissions;
10
+ private permissions;
11
11
  private getFile;
12
12
  private repository;
13
13
  private eventPublisher;
14
- constructor(identityContext: IdentityContext.Interface, filePermissions: FilePermissions.Interface, getFile: GetFileUseCase.Interface, repository: UpdateFileRepository.Interface, eventPublisher: EventPublisher.Interface);
14
+ constructor(identityContext: IdentityContext.Interface, permissions: FmPermissions.Interface, getFile: GetFileUseCase.Interface, repository: UpdateFileRepository.Interface, eventPublisher: EventPublisher.Interface);
15
15
  execute(input: UpdateFileInput): Promise<Result<File, UseCaseAbstraction.Error>>;
16
16
  }
17
17
  export declare const UpdateFileUseCase: typeof UpdateFileUseCaseImpl & {
@@ -4,51 +4,48 @@ import { GetFileUseCase } from "../GetFile/abstractions.js";
4
4
  import { EventPublisher } from "@webiny/api-core/features/EventPublisher";
5
5
  import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
6
6
  import { FileBeforeUpdateEvent, FileAfterUpdateEvent } from "./events.js";
7
- import { FilePermissions } from "../../shared/abstractions.js";
8
- import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
7
+ import { FmPermissions } from "../../shared/abstractions.js";
8
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
9
9
  import { Identity } from "../../../domain/identity/Identity.js";
10
10
  class UpdateFileUseCaseImpl {
11
- constructor(identityContext, filePermissions, getFile, repository, eventPublisher) {
11
+ constructor(identityContext, permissions, getFile, repository, eventPublisher) {
12
12
  this.identityContext = identityContext;
13
- this.filePermissions = filePermissions;
13
+ this.permissions = permissions;
14
14
  this.getFile = getFile;
15
15
  this.repository = repository;
16
16
  this.eventPublisher = eventPublisher;
17
17
  }
18
18
  async execute(input) {
19
- // Check write permission
20
- const hasPermission = await this.filePermissions.ensure({
21
- rwd: "w"
22
- });
19
+ const hasPermission = await this.permissions.canEdit("file");
23
20
  if (!hasPermission) {
24
21
  return Result.fail(new FileNotAuthorizedError());
25
22
  }
26
23
 
27
- // Get the original file (includes ownership check)
24
+ // Get the original file (includes ownership check).
28
25
  const getResult = await this.getFile.execute(input.id);
29
26
  if (getResult.isFail()) {
30
27
  return Result.fail(getResult.error);
31
28
  }
32
29
  const original = getResult.value;
33
- const isOwn = await this.filePermissions.ensure({
34
- owns: original.createdBy
35
- });
36
- if (!isOwn) {
30
+
31
+ // Check ownership-aware edit permission.
32
+ const canEditFile = await this.permissions.canEdit("file", original);
33
+ if (!canEditFile) {
37
34
  return Result.fail(new FileNotAuthorizedError());
38
35
  }
39
36
  const currentIdentity = this.identityContext.getIdentity();
40
37
  const file = {
41
38
  ...original,
42
39
  ...input,
43
- // Preserve immutable fields
40
+ // Preserve immutable fields.
44
41
  id: original.id,
45
42
  key: original.key,
46
43
  size: original.size,
47
44
  type: original.type,
48
- // Update mutable fields
45
+ // Update mutable fields.
49
46
  tags: input.tags !== undefined ? input.tags : original.tags,
50
47
  location: input.location !== undefined ? input.location : original.location,
51
- // System fields
48
+ // System fields.
52
49
  createdOn: input.createdOn ?? original.createdOn,
53
50
  modifiedOn: input.modifiedOn ?? undefined,
54
51
  savedOn: input.savedOn ?? original.savedOn,
@@ -75,7 +72,7 @@ class UpdateFileUseCaseImpl {
75
72
  }
76
73
  export const UpdateFileUseCase = UseCaseAbstraction.createImplementation({
77
74
  implementation: UpdateFileUseCaseImpl,
78
- dependencies: [IdentityContext, FilePermissions, GetFileUseCase, UpdateFileRepository, EventPublisher]
75
+ dependencies: [IdentityContext, FmPermissions.Abstraction, GetFileUseCase, UpdateFileRepository, EventPublisher]
79
76
  });
80
77
 
81
78
  //# sourceMappingURL=UpdateFileUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Result","UpdateFileUseCase","UseCaseAbstraction","UpdateFileRepository","GetFileUseCase","EventPublisher","FileNotAuthorizedError","FileBeforeUpdateEvent","FileAfterUpdateEvent","FilePermissions","IdentityContext","Identity","UpdateFileUseCaseImpl","constructor","identityContext","filePermissions","getFile","repository","eventPublisher","execute","input","hasPermission","ensure","rwd","fail","getResult","id","isFail","error","original","value","isOwn","owns","createdBy","currentIdentity","getIdentity","file","key","size","type","tags","undefined","location","createdOn","modifiedOn","savedOn","from","modifiedBy","savedBy","publish","result","update","ok","createImplementation","implementation","dependencies"],"sources":["UpdateFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n UpdateFileUseCase as UseCaseAbstraction,\n UpdateFileInput,\n UpdateFileRepository\n} from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../GetFile/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FileBeforeUpdateEvent, FileAfterUpdateEvent } from \"./events.js\";\nimport { FilePermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\nimport { Identity } from \"~/domain/identity/Identity.js\";\n\nclass UpdateFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private filePermissions: FilePermissions.Interface,\n private getFile: GetFileUseCase.Interface,\n private repository: UpdateFileRepository.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(input: UpdateFileInput): Promise<Result<File, UseCaseAbstraction.Error>> {\n // Check write permission\n const hasPermission = await this.filePermissions.ensure({ rwd: \"w\" });\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Get the original file (includes ownership check)\n const getResult = await this.getFile.execute(input.id);\n\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const original = getResult.value;\n\n const isOwn = await this.filePermissions.ensure({ owns: original.createdBy });\n if (!isOwn) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const currentIdentity = this.identityContext.getIdentity();\n\n const file: File = {\n ...original,\n ...input,\n // Preserve immutable fields\n id: original.id,\n key: original.key,\n size: original.size,\n type: original.type,\n // Update mutable fields\n tags: input.tags !== undefined ? input.tags : original.tags,\n location: input.location !== undefined ? input.location : original.location,\n // System fields\n createdOn: input.createdOn ?? original.createdOn,\n modifiedOn: input.modifiedOn ?? undefined,\n savedOn: input.savedOn ?? original.savedOn,\n createdBy: input.createdBy ? Identity.from(input.createdBy) : original.createdBy,\n modifiedBy: input.modifiedBy\n ? Identity.from(input.modifiedBy)\n : Identity.from(currentIdentity),\n savedBy: input.savedBy ? Identity.from(input.savedBy) : Identity.from(currentIdentity)\n };\n\n await this.eventPublisher.publish(new FileBeforeUpdateEvent({ original, file, input }));\n\n const result = await this.repository.update(file);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterUpdateEvent({ original, file, input }));\n\n return Result.ok(file);\n }\n}\n\nexport const UpdateFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateFileUseCaseImpl,\n dependencies: [\n IdentityContext,\n FilePermissions,\n GetFileUseCase,\n UpdateFileRepository,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Result","UpdateFileUseCase","UseCaseAbstraction","UpdateFileRepository","GetFileUseCase","EventPublisher","FileNotAuthorizedError","FileBeforeUpdateEvent","FileAfterUpdateEvent","FmPermissions","IdentityContext","Identity","UpdateFileUseCaseImpl","constructor","identityContext","permissions","getFile","repository","eventPublisher","execute","input","hasPermission","canEdit","fail","getResult","id","isFail","error","original","value","canEditFile","currentIdentity","getIdentity","file","key","size","type","tags","undefined","location","createdOn","modifiedOn","savedOn","createdBy","from","modifiedBy","savedBy","publish","result","update","ok","createImplementation","implementation","dependencies","Abstraction"],"sources":["UpdateFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n UpdateFileUseCase as UseCaseAbstraction,\n UpdateFileInput,\n UpdateFileRepository\n} from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../GetFile/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/EventPublisher\";\nimport type { File } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FileBeforeUpdateEvent, FileAfterUpdateEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { Identity } from \"~/domain/identity/Identity.js\";\n\nclass UpdateFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private permissions: FmPermissions.Interface,\n private getFile: GetFileUseCase.Interface,\n private repository: UpdateFileRepository.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(input: UpdateFileInput): Promise<Result<File, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canEdit(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Get the original file (includes ownership check).\n const getResult = await this.getFile.execute(input.id);\n\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const original = getResult.value;\n\n // Check ownership-aware edit permission.\n const canEditFile = await this.permissions.canEdit(\"file\", original);\n if (!canEditFile) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const currentIdentity = this.identityContext.getIdentity();\n\n const file: File = {\n ...original,\n ...input,\n // Preserve immutable fields.\n id: original.id,\n key: original.key,\n size: original.size,\n type: original.type,\n // Update mutable fields.\n tags: input.tags !== undefined ? input.tags : original.tags,\n location: input.location !== undefined ? input.location : original.location,\n // System fields.\n createdOn: input.createdOn ?? original.createdOn,\n modifiedOn: input.modifiedOn ?? undefined,\n savedOn: input.savedOn ?? original.savedOn,\n createdBy: input.createdBy ? Identity.from(input.createdBy) : original.createdBy,\n modifiedBy: input.modifiedBy\n ? Identity.from(input.modifiedBy)\n : Identity.from(currentIdentity),\n savedBy: input.savedBy ? Identity.from(input.savedBy) : Identity.from(currentIdentity)\n };\n\n await this.eventPublisher.publish(new FileBeforeUpdateEvent({ original, file, input }));\n\n const result = await this.repository.update(file);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterUpdateEvent({ original, file, input }));\n\n return Result.ok(file);\n }\n}\n\nexport const UpdateFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateFileUseCaseImpl,\n dependencies: [\n IdentityContext,\n FmPermissions.Abstraction,\n GetFileUseCase,\n UpdateFileRepository,\n EventPublisher\n ]\n});\n"],"mappings":"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","ignoreList":[]}
@@ -1,13 +1 @@
1
- import type { AppPermissions } from "@webiny/api-core/features/security/utils/AppPermissions.js";
2
- import type { FilePermission, SettingsPermission } from "../../types.js";
3
- type IFilePermissions = AppPermissions<FilePermission>;
4
- export declare const FilePermissions: import("@webiny/di").Abstraction<IFilePermissions>;
5
- export declare namespace FilePermissions {
6
- type Interface = IFilePermissions;
7
- }
8
- type ISettingsPermissions = AppPermissions<SettingsPermission>;
9
- export declare const SettingsPermissions: import("@webiny/di").Abstraction<ISettingsPermissions>;
10
- export declare namespace SettingsPermissions {
11
- type Interface = ISettingsPermissions;
12
- }
13
- export {};
1
+ export { FmPermissions } from "../../permissions/schema.js";
@@ -1,5 +1,3 @@
1
- import { createAbstraction } from "@webiny/feature/api";
2
- export const FilePermissions = createAbstraction("FilePermissions");
3
- export const SettingsPermissions = createAbstraction("SettingsPermission");
1
+ export { FmPermissions } from "../../permissions/schema.js";
4
2
 
5
3
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","FilePermissions","SettingsPermissions"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { AppPermissions } from \"@webiny/api-core/features/security/utils/AppPermissions.js\";\nimport type { FilePermission, SettingsPermission } from \"~/types.js\";\n\ntype IFilePermissions = AppPermissions<FilePermission>;\n\nexport const FilePermissions = createAbstraction<IFilePermissions>(\"FilePermissions\");\n\nexport namespace FilePermissions {\n export type Interface = IFilePermissions;\n}\n\ntype ISettingsPermissions = AppPermissions<SettingsPermission>;\n\nexport const SettingsPermissions = createAbstraction<ISettingsPermissions>(\"SettingsPermission\");\n\nexport namespace SettingsPermissions {\n export type Interface = ISettingsPermissions;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAMvD,OAAO,MAAMC,eAAe,GAAGD,iBAAiB,CAAmB,iBAAiB,CAAC;AAQrF,OAAO,MAAME,mBAAmB,GAAGF,iBAAiB,CAAuB,oBAAoB,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["FmPermissions"],"sources":["abstractions.ts"],"sourcesContent":["export { FmPermissions } from \"~/permissions/schema.js\";\n"],"mappings":"AAAA,SAASA,aAAa","ignoreList":[]}
package/index.js CHANGED
@@ -1,11 +1,8 @@
1
1
  import { ContextPlugin } from "@webiny/api";
2
- import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
3
2
  import { setupAssetDelivery } from "./delivery/setupAssetDelivery.js";
4
3
  import { createGraphQLSchemaPlugin } from "./graphql/index.js";
5
4
  import { FileManagerFeature } from "./features/FileManagerFeature.js";
6
- import { FilesPermissions as FilePermissionsImpl } from "./permissions/FilesPermissions.js";
7
- import { SettingsPermissions as SettingsPermissionsImpl } from "./permissions/SettingsPermissions.js";
8
- import { FilePermissions, SettingsPermissions } from "./features/shared/abstractions.js";
5
+ import { FmPermissions } from "./permissions/schema.js";
9
6
  import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
10
7
  import { FileModel as FileModelAbstraction } from "./domain/file/abstractions.js";
11
8
  import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
@@ -24,19 +21,7 @@ export const createFileManagerContext = () => {
24
21
  const fileModel = await getModel.execute(FILE_MODEL_ID);
25
22
  context.container.registerInstance(FileModelAbstraction, fileModel.value);
26
23
  });
27
- const identityContext = context.container.resolve(IdentityContext);
28
- const filePermissions = new FilePermissionsImpl({
29
- getIdentity: () => identityContext.getIdentity(),
30
- getPermissions: () => identityContext.getPermissions("fm.file"),
31
- fullAccessPermissionName: "fm.*"
32
- });
33
- const settingsPermissions = new SettingsPermissionsImpl({
34
- getIdentity: () => identityContext.getIdentity(),
35
- getPermissions: () => identityContext.getPermissions("fm.settings"),
36
- fullAccessPermissionName: "fm.*"
37
- });
38
- context.container.registerInstance(FilePermissions, filePermissions);
39
- context.container.registerInstance(SettingsPermissions, settingsPermissions);
24
+ context.container.register(FmPermissions.Implementation);
40
25
  FileManagerFeature.register(context.container);
41
26
  });
42
27
  plugin.name = "file-manager.createContext";
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ContextPlugin","IdentityContext","setupAssetDelivery","createGraphQLSchemaPlugin","FileManagerFeature","FilesPermissions","FilePermissionsImpl","SettingsPermissions","SettingsPermissionsImpl","FilePermissions","GetModelUseCase","FileModel","FileModelAbstraction","TenantContext","FILE_MODEL_ID","createFileManagerContext","plugin","context","tenantContext","container","resolve","getModel","getTenant","register","security","withoutAuthorization","fileModel","execute","registerInstance","value","identityContext","filePermissions","getIdentity","getPermissions","fullAccessPermissionName","settingsPermissions","name","createFileManagerGraphQL","createAssetDelivery"],"sources":["index.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport type { FilePermission, SettingsPermission } from \"~/types.js\";\nimport { setupAssetDelivery } from \"./delivery/setupAssetDelivery.js\";\nimport { createGraphQLSchemaPlugin } from \"./graphql/index.js\";\nimport { FileManagerFeature } from \"~/features/FileManagerFeature.js\";\nimport { FilesPermissions as FilePermissionsImpl } from \"~/permissions/FilesPermissions.js\";\nimport { SettingsPermissions as SettingsPermissionsImpl } from \"~/permissions/SettingsPermissions.js\";\nimport { FilePermissions, SettingsPermissions } from \"~/features/shared/abstractions.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { FileModel as FileModelAbstraction } from \"~/domain/file/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { FileModel, FILE_MODEL_ID } from \"~/domain/file/file.model.js\";\n\nexport * from \"./modelModifier/CmsModelModifier.js\";\nexport * from \"./delivery/index.js\";\n\nexport const createFileManagerContext = () => {\n const plugin = new ContextPlugin<ApiCoreContext>(async context => {\n const tenantContext = context.container.resolve(TenantContext);\n const getModel = context.container.resolve(GetModelUseCase);\n\n if (!tenantContext.getTenant()) {\n return;\n }\n\n context.container.register(FileModel);\n\n await context.security.withoutAuthorization(async () => {\n const fileModel = await getModel.execute(FILE_MODEL_ID);\n context.container.registerInstance(FileModelAbstraction, fileModel.value);\n });\n\n const identityContext = context.container.resolve(IdentityContext);\n\n const filePermissions = new FilePermissionsImpl({\n getIdentity: () => identityContext.getIdentity(),\n getPermissions: () => identityContext.getPermissions<FilePermission>(\"fm.file\"),\n fullAccessPermissionName: \"fm.*\"\n });\n\n const settingsPermissions = new SettingsPermissionsImpl({\n getIdentity: () => identityContext.getIdentity(),\n getPermissions: () => identityContext.getPermissions<SettingsPermission>(\"fm.settings\"),\n fullAccessPermissionName: \"fm.*\"\n });\n\n context.container.registerInstance(FilePermissions, filePermissions);\n context.container.registerInstance(SettingsPermissions, settingsPermissions);\n\n FileManagerFeature.register(context.container);\n });\n\n plugin.name = \"file-manager.createContext\";\n\n return plugin;\n};\n\nexport const createFileManagerGraphQL = () => {\n return createGraphQLSchemaPlugin();\n};\n\nexport const createAssetDelivery = () => {\n return setupAssetDelivery();\n};\n"],"mappings":"AACA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,eAAe,QAAQ,6DAA6D;AAE7F,SAASC,kBAAkB;AAC3B,SAASC,yBAAyB;AAClC,SAASC,kBAAkB;AAC3B,SAASC,gBAAgB,IAAIC,mBAAmB;AAChD,SAASC,mBAAmB,IAAIC,uBAAuB;AACvD,SAASC,eAAe,EAAEF,mBAAmB;AAC7C,SAASG,eAAe,QAAQ,kEAAkE;AAClG,SAASC,SAAS,IAAIC,oBAAoB;AAC1C,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASF,SAAS,EAAEG,aAAa;AAEjC;AACA;AAEA,OAAO,MAAMC,wBAAwB,GAAGA,CAAA,KAAM;EAC1C,MAAMC,MAAM,GAAG,IAAIhB,aAAa,CAAiB,MAAMiB,OAAO,IAAI;IAC9D,MAAMC,aAAa,GAAGD,OAAO,CAACE,SAAS,CAACC,OAAO,CAACP,aAAa,CAAC;IAC9D,MAAMQ,QAAQ,GAAGJ,OAAO,CAACE,SAAS,CAACC,OAAO,CAACV,eAAe,CAAC;IAE3D,IAAI,CAACQ,aAAa,CAACI,SAAS,CAAC,CAAC,EAAE;MAC5B;IACJ;IAEAL,OAAO,CAACE,SAAS,CAACI,QAAQ,CAACZ,SAAS,CAAC;IAErC,MAAMM,OAAO,CAACO,QAAQ,CAACC,oBAAoB,CAAC,YAAY;MACpD,MAAMC,SAAS,GAAG,MAAML,QAAQ,CAACM,OAAO,CAACb,aAAa,CAAC;MACvDG,OAAO,CAACE,SAAS,CAACS,gBAAgB,CAAChB,oBAAoB,EAAEc,SAAS,CAACG,KAAK,CAAC;IAC7E,CAAC,CAAC;IAEF,MAAMC,eAAe,GAAGb,OAAO,CAACE,SAAS,CAACC,OAAO,CAACnB,eAAe,CAAC;IAElE,MAAM8B,eAAe,GAAG,IAAIzB,mBAAmB,CAAC;MAC5C0B,WAAW,EAAEA,CAAA,KAAMF,eAAe,CAACE,WAAW,CAAC,CAAC;MAChDC,cAAc,EAAEA,CAAA,KAAMH,eAAe,CAACG,cAAc,CAAiB,SAAS,CAAC;MAC/EC,wBAAwB,EAAE;IAC9B,CAAC,CAAC;IAEF,MAAMC,mBAAmB,GAAG,IAAI3B,uBAAuB,CAAC;MACpDwB,WAAW,EAAEA,CAAA,KAAMF,eAAe,CAACE,WAAW,CAAC,CAAC;MAChDC,cAAc,EAAEA,CAAA,KAAMH,eAAe,CAACG,cAAc,CAAqB,aAAa,CAAC;MACvFC,wBAAwB,EAAE;IAC9B,CAAC,CAAC;IAEFjB,OAAO,CAACE,SAAS,CAACS,gBAAgB,CAACnB,eAAe,EAAEsB,eAAe,CAAC;IACpEd,OAAO,CAACE,SAAS,CAACS,gBAAgB,CAACrB,mBAAmB,EAAE4B,mBAAmB,CAAC;IAE5E/B,kBAAkB,CAACmB,QAAQ,CAACN,OAAO,CAACE,SAAS,CAAC;EAClD,CAAC,CAAC;EAEFH,MAAM,CAACoB,IAAI,GAAG,4BAA4B;EAE1C,OAAOpB,MAAM;AACjB,CAAC;AAED,OAAO,MAAMqB,wBAAwB,GAAGA,CAAA,KAAM;EAC1C,OAAOlC,yBAAyB,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,MAAMmC,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAOpC,kBAAkB,CAAC,CAAC;AAC/B,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ContextPlugin","setupAssetDelivery","createGraphQLSchemaPlugin","FileManagerFeature","FmPermissions","GetModelUseCase","FileModel","FileModelAbstraction","TenantContext","FILE_MODEL_ID","createFileManagerContext","plugin","context","tenantContext","container","resolve","getModel","getTenant","register","security","withoutAuthorization","fileModel","execute","registerInstance","value","Implementation","name","createFileManagerGraphQL","createAssetDelivery"],"sources":["index.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { setupAssetDelivery } from \"./delivery/setupAssetDelivery.js\";\nimport { createGraphQLSchemaPlugin } from \"./graphql/index.js\";\nimport { FileManagerFeature } from \"~/features/FileManagerFeature.js\";\nimport { FmPermissions } from \"~/permissions/schema.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { FileModel as FileModelAbstraction } from \"~/domain/file/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { FileModel, FILE_MODEL_ID } from \"~/domain/file/file.model.js\";\n\nexport * from \"./modelModifier/CmsModelModifier.js\";\nexport * from \"./delivery/index.js\";\n\nexport const createFileManagerContext = () => {\n const plugin = new ContextPlugin<ApiCoreContext>(async context => {\n const tenantContext = context.container.resolve(TenantContext);\n const getModel = context.container.resolve(GetModelUseCase);\n\n if (!tenantContext.getTenant()) {\n return;\n }\n\n context.container.register(FileModel);\n\n await context.security.withoutAuthorization(async () => {\n const fileModel = await getModel.execute(FILE_MODEL_ID);\n context.container.registerInstance(FileModelAbstraction, fileModel.value);\n });\n\n context.container.register(FmPermissions.Implementation);\n\n FileManagerFeature.register(context.container);\n });\n\n plugin.name = \"file-manager.createContext\";\n\n return plugin;\n};\n\nexport const createFileManagerGraphQL = () => {\n return createGraphQLSchemaPlugin();\n};\n\nexport const createAssetDelivery = () => {\n return setupAssetDelivery();\n};\n"],"mappings":"AACA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,kBAAkB;AAC3B,SAASC,yBAAyB;AAClC,SAASC,kBAAkB;AAC3B,SAASC,aAAa;AACtB,SAASC,eAAe,QAAQ,kEAAkE;AAClG,SAASC,SAAS,IAAIC,oBAAoB;AAC1C,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASF,SAAS,EAAEG,aAAa;AAEjC;AACA;AAEA,OAAO,MAAMC,wBAAwB,GAAGA,CAAA,KAAM;EAC1C,MAAMC,MAAM,GAAG,IAAIX,aAAa,CAAiB,MAAMY,OAAO,IAAI;IAC9D,MAAMC,aAAa,GAAGD,OAAO,CAACE,SAAS,CAACC,OAAO,CAACP,aAAa,CAAC;IAC9D,MAAMQ,QAAQ,GAAGJ,OAAO,CAACE,SAAS,CAACC,OAAO,CAACV,eAAe,CAAC;IAE3D,IAAI,CAACQ,aAAa,CAACI,SAAS,CAAC,CAAC,EAAE;MAC5B;IACJ;IAEAL,OAAO,CAACE,SAAS,CAACI,QAAQ,CAACZ,SAAS,CAAC;IAErC,MAAMM,OAAO,CAACO,QAAQ,CAACC,oBAAoB,CAAC,YAAY;MACpD,MAAMC,SAAS,GAAG,MAAML,QAAQ,CAACM,OAAO,CAACb,aAAa,CAAC;MACvDG,OAAO,CAACE,SAAS,CAACS,gBAAgB,CAAChB,oBAAoB,EAAEc,SAAS,CAACG,KAAK,CAAC;IAC7E,CAAC,CAAC;IAEFZ,OAAO,CAACE,SAAS,CAACI,QAAQ,CAACd,aAAa,CAACqB,cAAc,CAAC;IAExDtB,kBAAkB,CAACe,QAAQ,CAACN,OAAO,CAACE,SAAS,CAAC;EAClD,CAAC,CAAC;EAEFH,MAAM,CAACe,IAAI,GAAG,4BAA4B;EAE1C,OAAOf,MAAM;AACjB,CAAC;AAED,OAAO,MAAMgB,wBAAwB,GAAGA,CAAA,KAAM;EAC1C,OAAOzB,yBAAyB,CAAC,CAAC;AACtC,CAAC;AAED,OAAO,MAAM0B,mBAAmB,GAAGA,CAAA,KAAM;EACrC,OAAO3B,kBAAkB,CAAC,CAAC;AAC/B,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager",
3
- "version": "0.0.0-unstable.df7a8bb475",
3
+ "version": "0.0.0-unstable.e2758ee1cf",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "keywords": [
@@ -19,25 +19,25 @@
19
19
  ],
20
20
  "license": "MIT",
21
21
  "dependencies": {
22
- "@webiny/api": "0.0.0-unstable.df7a8bb475",
23
- "@webiny/api-core": "0.0.0-unstable.df7a8bb475",
24
- "@webiny/api-headless-cms": "0.0.0-unstable.df7a8bb475",
25
- "@webiny/build-tools": "0.0.0-unstable.df7a8bb475",
22
+ "@webiny/api": "0.0.0-unstable.e2758ee1cf",
23
+ "@webiny/api-core": "0.0.0-unstable.e2758ee1cf",
24
+ "@webiny/api-headless-cms": "0.0.0-unstable.e2758ee1cf",
25
+ "@webiny/build-tools": "0.0.0-unstable.e2758ee1cf",
26
26
  "@webiny/di": "0.2.3",
27
- "@webiny/error": "0.0.0-unstable.df7a8bb475",
28
- "@webiny/feature": "0.0.0-unstable.df7a8bb475",
29
- "@webiny/handler": "0.0.0-unstable.df7a8bb475",
30
- "@webiny/handler-graphql": "0.0.0-unstable.df7a8bb475",
31
- "@webiny/plugins": "0.0.0-unstable.df7a8bb475",
32
- "@webiny/wcp": "0.0.0-unstable.df7a8bb475",
27
+ "@webiny/error": "0.0.0-unstable.e2758ee1cf",
28
+ "@webiny/feature": "0.0.0-unstable.e2758ee1cf",
29
+ "@webiny/handler": "0.0.0-unstable.e2758ee1cf",
30
+ "@webiny/handler-graphql": "0.0.0-unstable.e2758ee1cf",
31
+ "@webiny/plugins": "0.0.0-unstable.e2758ee1cf",
32
+ "@webiny/wcp": "0.0.0-unstable.e2758ee1cf",
33
33
  "cache-control-parser": "2.2.0",
34
34
  "zod": "3.25.76"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/object-hash": "3.0.6",
38
- "@webiny/handler-aws": "0.0.0-unstable.df7a8bb475",
39
- "@webiny/project-utils": "0.0.0-unstable.df7a8bb475",
40
- "@webiny/utils": "0.0.0-unstable.df7a8bb475",
38
+ "@webiny/handler-aws": "0.0.0-unstable.e2758ee1cf",
39
+ "@webiny/project-utils": "0.0.0-unstable.e2758ee1cf",
40
+ "@webiny/utils": "0.0.0-unstable.e2758ee1cf",
41
41
  "@webiny/wcp": "0.0.0",
42
42
  "rimraf": "6.1.3",
43
43
  "typescript": "5.9.3"
@@ -59,5 +59,5 @@
59
59
  ]
60
60
  }
61
61
  },
62
- "gitHead": "df7a8bb4755a1da047f0af8c56bdb649cc81bf7d"
62
+ "gitHead": "e2758ee1cfa3b9a7152e9bb995a90ccabd33266f"
63
63
  }
@@ -0,0 +1,73 @@
1
+ import type { Permissions } from "@webiny/api-core/features/security/permissions/index.js";
2
+ declare const schema: {
3
+ readonly prefix: "fm";
4
+ readonly fullAccess: true;
5
+ readonly entities: readonly [{
6
+ readonly id: "file";
7
+ readonly permission: "fm.file";
8
+ readonly scopes: readonly ["full", "own"];
9
+ readonly actions: readonly [{
10
+ readonly name: "rwd";
11
+ }];
12
+ }, {
13
+ readonly id: "settings";
14
+ readonly permission: "fm.settings";
15
+ readonly scopes: readonly ["full"];
16
+ }];
17
+ };
18
+ type FmSchema = typeof schema;
19
+ export declare const FmPermissions: {
20
+ Abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
21
+ readonly prefix: "fm";
22
+ readonly fullAccess: true;
23
+ readonly entities: readonly [{
24
+ readonly id: "file";
25
+ readonly permission: "fm.file";
26
+ readonly scopes: readonly ["full", "own"];
27
+ readonly actions: readonly [{
28
+ readonly name: "rwd";
29
+ }];
30
+ }, {
31
+ readonly id: "settings";
32
+ readonly permission: "fm.settings";
33
+ readonly scopes: readonly ["full"];
34
+ }];
35
+ }>>;
36
+ Implementation: import("@webiny/di").Constructor<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
37
+ readonly prefix: "fm";
38
+ readonly fullAccess: true;
39
+ readonly entities: readonly [{
40
+ readonly id: "file";
41
+ readonly permission: "fm.file";
42
+ readonly scopes: readonly ["full", "own"];
43
+ readonly actions: readonly [{
44
+ readonly name: "rwd";
45
+ }];
46
+ }, {
47
+ readonly id: "settings";
48
+ readonly permission: "fm.settings";
49
+ readonly scopes: readonly ["full"];
50
+ }];
51
+ }>> & {
52
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/security/permissions/types").PermissionsTyped<{
53
+ readonly prefix: "fm";
54
+ readonly fullAccess: true;
55
+ readonly entities: readonly [{
56
+ readonly id: "file";
57
+ readonly permission: "fm.file";
58
+ readonly scopes: readonly ["full", "own"];
59
+ readonly actions: readonly [{
60
+ readonly name: "rwd";
61
+ }];
62
+ }, {
63
+ readonly id: "settings";
64
+ readonly permission: "fm.settings";
65
+ readonly scopes: readonly ["full"];
66
+ }];
67
+ }>>;
68
+ };
69
+ };
70
+ export declare namespace FmPermissions {
71
+ type Interface = Permissions<FmSchema>;
72
+ }
73
+ export {};
@@ -0,0 +1,20 @@
1
+ import { createPermissions } from "@webiny/api-core/features/security/permissions/index.js";
2
+ const schema = {
3
+ prefix: "fm",
4
+ fullAccess: true,
5
+ entities: [{
6
+ id: "file",
7
+ permission: "fm.file",
8
+ scopes: ["full", "own"],
9
+ actions: [{
10
+ name: "rwd"
11
+ }]
12
+ }, {
13
+ id: "settings",
14
+ permission: "fm.settings",
15
+ scopes: ["full"]
16
+ }]
17
+ };
18
+ export const FmPermissions = createPermissions(schema);
19
+
20
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPermissions","schema","prefix","fullAccess","entities","id","permission","scopes","actions","name","FmPermissions"],"sources":["schema.ts"],"sourcesContent":["import { createPermissions } from \"@webiny/api-core/features/security/permissions/index.js\";\nimport type { Permissions } from \"@webiny/api-core/features/security/permissions/index.js\";\n\nconst schema = {\n prefix: \"fm\",\n fullAccess: true,\n entities: [\n {\n id: \"file\",\n permission: \"fm.file\",\n scopes: [\"full\", \"own\"],\n actions: [{ name: \"rwd\" }]\n },\n {\n id: \"settings\",\n permission: \"fm.settings\",\n scopes: [\"full\"]\n }\n ]\n} as const;\n\ntype FmSchema = typeof schema;\n\nexport const FmPermissions = createPermissions(schema);\n\nexport namespace FmPermissions {\n export type Interface = Permissions<FmSchema>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,yDAAyD;AAG3F,MAAMC,MAAM,GAAG;EACXC,MAAM,EAAE,IAAI;EACZC,UAAU,EAAE,IAAI;EAChBC,QAAQ,EAAE,CACN;IACIC,EAAE,EAAE,MAAM;IACVC,UAAU,EAAE,SAAS;IACrBC,MAAM,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACvBC,OAAO,EAAE,CAAC;MAAEC,IAAI,EAAE;IAAM,CAAC;EAC7B,CAAC,EACD;IACIJ,EAAE,EAAE,UAAU;IACdC,UAAU,EAAE,aAAa;IACzBC,MAAM,EAAE,CAAC,MAAM;EACnB,CAAC;AAET,CAAU;AAIV,OAAO,MAAMG,aAAa,GAAGV,iBAAiB,CAACC,MAAM,CAAC","ignoreList":[]}
package/types.d.ts CHANGED
@@ -4,6 +4,3 @@ export interface FilePermission extends SecurityPermission {
4
4
  rwd?: string;
5
5
  own?: boolean;
6
6
  }
7
- export interface SettingsPermission extends SecurityPermission {
8
- name: "fm.setting";
9
- }
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { SecurityPermission } from \"@webiny/api-core/types/security.js\";\n\nexport interface FilePermission extends SecurityPermission {\n name: \"fm.file\";\n rwd?: string;\n own?: boolean;\n}\n\nexport interface SettingsPermission extends SecurityPermission {\n name: \"fm.setting\";\n}\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { SecurityPermission } from \"@webiny/api-core/types/security.js\";\n\nexport interface FilePermission extends SecurityPermission {\n name: \"fm.file\";\n rwd?: string;\n own?: boolean;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import type { FilePermission } from "../types.js";
2
- import { AppPermissions } from "@webiny/api-core/features/security/utils/AppPermissions.js";
3
- export declare class FilesPermissions extends AppPermissions<FilePermission> {
4
- }
@@ -1,4 +0,0 @@
1
- import { AppPermissions } from "@webiny/api-core/features/security/utils/AppPermissions.js";
2
- export class FilesPermissions extends AppPermissions {}
3
-
4
- //# sourceMappingURL=FilesPermissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["AppPermissions","FilesPermissions"],"sources":["FilesPermissions.ts"],"sourcesContent":["import type { FilePermission } from \"~/types.js\";\nimport { AppPermissions } from \"@webiny/api-core/features/security/utils/AppPermissions.js\";\n\nexport class FilesPermissions extends AppPermissions<FilePermission> {}\n"],"mappings":"AACA,SAASA,cAAc,QAAQ,4DAA4D;AAE3F,OAAO,MAAMC,gBAAgB,SAASD,cAAc,CAAiB","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import type { SettingsPermission } from "../types.js";
2
- import { AppPermissions } from "@webiny/api-core/features/security/utils/AppPermissions.js";
3
- export declare class SettingsPermissions extends AppPermissions<SettingsPermission> {
4
- }
@@ -1,4 +0,0 @@
1
- import { AppPermissions } from "@webiny/api-core/features/security/utils/AppPermissions.js";
2
- export class SettingsPermissions extends AppPermissions {}
3
-
4
- //# sourceMappingURL=SettingsPermissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["AppPermissions","SettingsPermissions"],"sources":["SettingsPermissions.ts"],"sourcesContent":["import type { SettingsPermission } from \"~/types.js\";\nimport { AppPermissions } from \"@webiny/api-core/features/security/utils/AppPermissions.js\";\n\nexport class SettingsPermissions extends AppPermissions<SettingsPermission> {}\n"],"mappings":"AACA,SAASA,cAAc,QAAQ,4DAA4D;AAE3F,OAAO,MAAMC,mBAAmB,SAASD,cAAc,CAAqB","ignoreList":[]}