@webiny/api-file-manager 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (170) hide show
  1. package/FileManagerAppFeature.d.ts +5 -0
  2. package/FileManagerAppFeature.js +21 -0
  3. package/FileManagerAppFeature.js.map +1 -0
  4. package/{constants.js → contants.js} +1 -1
  5. package/contants.js.map +1 -0
  6. package/delivery/AssetDelivery/Asset.d.ts +1 -2
  7. package/delivery/AssetDelivery/Asset.js +1 -4
  8. package/delivery/AssetDelivery/Asset.js.map +1 -1
  9. package/delivery/AssetDelivery/AssetRequest.d.ts +2 -3
  10. package/delivery/AssetDelivery/AssetRequest.js +0 -3
  11. package/delivery/AssetDelivery/AssetRequest.js.map +1 -1
  12. package/delivery/AssetDelivery/abstractions/AssetReply.d.ts +1 -2
  13. package/delivery/AssetDelivery/abstractions/AssetReply.js +0 -5
  14. package/delivery/AssetDelivery/abstractions/AssetReply.js.map +1 -1
  15. package/delivery/AssetDeliveryRoute.d.ts +24 -0
  16. package/delivery/AssetDeliveryRoute.js +69 -0
  17. package/delivery/AssetDeliveryRoute.js.map +1 -0
  18. package/delivery/index.d.ts +3 -3
  19. package/delivery/index.js +2 -0
  20. package/delivery/setupAssetDelivery.d.ts +1 -1
  21. package/delivery/setupAssetDelivery.js +1 -69
  22. package/delivery/setupAssetDelivery.js.map +1 -1
  23. package/domain/file/abstractions.d.ts +13 -5
  24. package/domain/file/abstractions.js +2 -2
  25. package/domain/file/abstractions.js.map +1 -1
  26. package/domain/file/file.model.d.ts +3 -3
  27. package/domain/file/file.model.js +7 -6
  28. package/domain/file/file.model.js.map +1 -1
  29. package/domain/settings/validation.js +3 -10
  30. package/domain/settings/validation.js.map +1 -1
  31. package/exports/api/file-manager/assetDelivery.d.ts +1 -9
  32. package/exports/api/file-manager/assetDelivery.js +1 -8
  33. package/exports/api/file-manager/file.d.ts +1 -1
  34. package/exports/api/file-manager/file.js +1 -1
  35. package/features/FileManagerFeature.js +0 -6
  36. package/features/FileManagerFeature.js.map +1 -1
  37. package/features/assetDelivery/Asset/Asset.js +1 -1
  38. package/features/assetDelivery/Asset/Asset.js.map +1 -1
  39. package/features/assetDelivery/FilesAssetRequestResolver.d.ts +7 -9
  40. package/features/assetDelivery/FilesAssetRequestResolver.js +16 -20
  41. package/features/assetDelivery/FilesAssetRequestResolver.js.map +1 -1
  42. package/features/assetDelivery/NullAssetOutputStrategy.d.ts +6 -6
  43. package/features/assetDelivery/NullAssetOutputStrategy.js +6 -6
  44. package/features/assetDelivery/NullAssetOutputStrategy.js.map +1 -1
  45. package/features/assetDelivery/NullAssetReply.d.ts +1 -2
  46. package/features/assetDelivery/NullAssetReply.js +0 -3
  47. package/features/assetDelivery/NullAssetReply.js.map +1 -1
  48. package/features/assetDelivery/NullAssetResolver.d.ts +6 -6
  49. package/features/assetDelivery/NullAssetResolver.js +5 -5
  50. package/features/assetDelivery/NullAssetResolver.js.map +1 -1
  51. package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js +1 -1
  52. package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js.map +1 -1
  53. package/features/assetDelivery/abstractions.d.ts +65 -0
  54. package/features/assetDelivery/abstractions.js +11 -0
  55. package/features/assetDelivery/abstractions.js.map +1 -0
  56. package/features/assetDelivery/assetTypes/image/SharpTransformer.d.ts +18 -0
  57. package/features/assetDelivery/assetTypes/image/SharpTransformer.js +47 -0
  58. package/features/assetDelivery/assetTypes/image/SharpTransformer.js.map +1 -0
  59. package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js +1 -1
  60. package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js.map +1 -1
  61. package/features/assetDelivery/feature.js +17 -20
  62. package/features/assetDelivery/feature.js.map +1 -1
  63. package/features/assetDelivery/privateFiles/NotAuthorizedOutputStrategy.d.ts +2 -2
  64. package/features/assetDelivery/privateFiles/NotAuthorizedOutputStrategy.js.map +1 -1
  65. package/features/assetDelivery/privateFiles/PrivateAuthenticatedAuthorizer.d.ts +3 -3
  66. package/features/assetDelivery/privateFiles/PrivateAuthenticatedAuthorizer.js +1 -1
  67. package/features/assetDelivery/privateFiles/PrivateAuthenticatedAuthorizer.js.map +1 -1
  68. package/features/assetDelivery/privateFiles/PrivateCache.d.ts +3 -3
  69. package/features/assetDelivery/privateFiles/PrivateCache.js.map +1 -1
  70. package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.d.ts +8 -9
  71. package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js +14 -17
  72. package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js.map +1 -1
  73. package/features/assetDelivery/privateFiles/PrivateFilesAssetProcessor.d.ts +8 -8
  74. package/features/assetDelivery/privateFiles/PrivateFilesAssetProcessor.js +7 -8
  75. package/features/assetDelivery/privateFiles/PrivateFilesAssetProcessor.js.map +1 -1
  76. package/features/assetDelivery/privateFiles/PublicCache.d.ts +3 -3
  77. package/features/assetDelivery/privateFiles/PublicCache.js.map +1 -1
  78. package/features/assetDelivery/privateFiles/RedirectToPrivateUrlOutputStrategy.d.ts +4 -5
  79. package/features/assetDelivery/privateFiles/RedirectToPrivateUrlOutputStrategy.js +1 -4
  80. package/features/assetDelivery/privateFiles/RedirectToPrivateUrlOutputStrategy.js.map +1 -1
  81. package/features/assetDelivery/privateFiles/RedirectToPublicUrlOutputStrategy.d.ts +4 -5
  82. package/features/assetDelivery/privateFiles/RedirectToPublicUrlOutputStrategy.js +1 -4
  83. package/features/assetDelivery/privateFiles/RedirectToPublicUrlOutputStrategy.js.map +1 -1
  84. package/features/assetDelivery/transformation/CallableContentsReader.d.ts +1 -1
  85. package/features/assetDelivery/transformation/CallableContentsReader.js.map +1 -1
  86. package/features/assetDelivery/transformation/TransformationAssetProcessor.d.ts +5 -3
  87. package/features/assetDelivery/transformation/TransformationAssetProcessor.js.map +1 -1
  88. package/features/file/CreateFile/CreateFileRepository.d.ts +3 -3
  89. package/features/file/CreateFile/CreateFileRepository.js +6 -5
  90. package/features/file/CreateFile/CreateFileRepository.js.map +1 -1
  91. package/features/file/DeleteFile/DeleteFileRepository.d.ts +3 -3
  92. package/features/file/DeleteFile/DeleteFileRepository.js +6 -5
  93. package/features/file/DeleteFile/DeleteFileRepository.js.map +1 -1
  94. package/features/file/FileModelProvider.d.ts +31 -0
  95. package/features/file/FileModelProvider.js +22 -0
  96. package/features/file/FileModelProvider.js.map +1 -0
  97. package/features/file/FileUrlGenerator/FileUrlGenerator.d.ts +3 -6
  98. package/features/file/FileUrlGenerator/FileUrlGenerator.js +5 -19
  99. package/features/file/FileUrlGenerator/FileUrlGenerator.js.map +1 -1
  100. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.d.ts +13 -0
  101. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js +29 -0
  102. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js.map +1 -0
  103. package/features/file/FileUrlGenerator/abstractions.d.ts +12 -0
  104. package/features/file/FileUrlGenerator/abstractions.js +2 -1
  105. package/features/file/FileUrlGenerator/abstractions.js.map +1 -1
  106. package/features/file/FileUrlGenerator/feature.js +2 -0
  107. package/features/file/FileUrlGenerator/feature.js.map +1 -1
  108. package/features/file/FileUrlGenerator/index.d.ts +1 -0
  109. package/features/file/FileUrlGenerator/index.js +1 -1
  110. package/features/file/GetFile/GetFileRepository.d.ts +3 -3
  111. package/features/file/GetFile/GetFileRepository.js +6 -5
  112. package/features/file/GetFile/GetFileRepository.js.map +1 -1
  113. package/features/file/ListFiles/ListFilesRepository.d.ts +3 -3
  114. package/features/file/ListFiles/ListFilesRepository.js +8 -7
  115. package/features/file/ListFiles/ListFilesRepository.js.map +1 -1
  116. package/features/file/ListImagesByTagTool/ListImagesByTagTool.d.ts +15 -5
  117. package/features/file/ListImagesByTagTool/ListImagesByTagTool.js +21 -7
  118. package/features/file/ListImagesByTagTool/ListImagesByTagTool.js.map +1 -1
  119. package/features/file/ListTags/ListTagsRepository.d.ts +3 -3
  120. package/features/file/ListTags/ListTagsRepository.js +7 -6
  121. package/features/file/ListTags/ListTagsRepository.js.map +1 -1
  122. package/features/file/UpdateFile/UpdateFileRepository.d.ts +3 -3
  123. package/features/file/UpdateFile/UpdateFileRepository.js +6 -5
  124. package/features/file/UpdateFile/UpdateFileRepository.js.map +1 -1
  125. package/features/settings/SettingsInstaller/SettingsInstaller.js +1 -4
  126. package/features/settings/SettingsInstaller/SettingsInstaller.js.map +1 -1
  127. package/features/settings/UpdateSettings/UpdateSettingsUseCase.d.ts +3 -1
  128. package/features/settings/UpdateSettings/UpdateSettingsUseCase.js +10 -3
  129. package/features/settings/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
  130. package/graphql/FmGraphQLSchema.d.ts +8 -9
  131. package/graphql/FmGraphQLSchema.js +27 -19
  132. package/graphql/FmGraphQLSchema.js.map +1 -1
  133. package/index.d.ts +4 -4
  134. package/index.js +4 -33
  135. package/index.js.map +1 -1
  136. package/package.json +18 -18
  137. package/constants.js.map +0 -1
  138. package/features/assetDelivery/AssetRequest/AssetRequest.d.ts +0 -8
  139. package/features/assetDelivery/AssetRequest/AssetRequest.js +0 -14
  140. package/features/assetDelivery/AssetRequest/AssetRequest.js.map +0 -1
  141. package/features/assetDelivery/AssetRequest/abstractions.d.ts +0 -11
  142. package/features/assetDelivery/AssetRequest/abstractions.js +0 -5
  143. package/features/assetDelivery/AssetRequest/abstractions.js.map +0 -1
  144. package/features/assetDelivery/AssetRequest/index.d.ts +0 -1
  145. package/features/assetDelivery/AssetRequest/index.js +0 -1
  146. package/features/assetDelivery/abstractions/AssetAuthorizer.d.ts +0 -9
  147. package/features/assetDelivery/abstractions/AssetAuthorizer.js +0 -5
  148. package/features/assetDelivery/abstractions/AssetAuthorizer.js.map +0 -1
  149. package/features/assetDelivery/abstractions/AssetContentsReader.d.ts +0 -9
  150. package/features/assetDelivery/abstractions/AssetContentsReader.js +0 -5
  151. package/features/assetDelivery/abstractions/AssetContentsReader.js.map +0 -1
  152. package/features/assetDelivery/abstractions/AssetOutputStrategy.d.ts +0 -11
  153. package/features/assetDelivery/abstractions/AssetOutputStrategy.js +0 -5
  154. package/features/assetDelivery/abstractions/AssetOutputStrategy.js.map +0 -1
  155. package/features/assetDelivery/abstractions/AssetProcessor.d.ts +0 -11
  156. package/features/assetDelivery/abstractions/AssetProcessor.js +0 -5
  157. package/features/assetDelivery/abstractions/AssetProcessor.js.map +0 -1
  158. package/features/assetDelivery/abstractions/AssetRequestResolver.d.ts +0 -11
  159. package/features/assetDelivery/abstractions/AssetRequestResolver.js +0 -5
  160. package/features/assetDelivery/abstractions/AssetRequestResolver.js.map +0 -1
  161. package/features/assetDelivery/abstractions/AssetResolver.d.ts +0 -11
  162. package/features/assetDelivery/abstractions/AssetResolver.js +0 -5
  163. package/features/assetDelivery/abstractions/AssetResolver.js.map +0 -1
  164. package/features/assetDelivery/abstractions/AssetTransformationStrategy.d.ts +0 -11
  165. package/features/assetDelivery/abstractions/AssetTransformationStrategy.js +0 -5
  166. package/features/assetDelivery/abstractions/AssetTransformationStrategy.js.map +0 -1
  167. package/graphql/FmUploadGraphQLSchema.d.ts +0 -11
  168. package/graphql/FmUploadGraphQLSchema.js +0 -231
  169. package/graphql/FmUploadGraphQLSchema.js.map +0 -1
  170. /package/{constants.d.ts → contants.d.ts} +0 -0
@@ -0,0 +1,31 @@
1
+ import type { CmsModel } from "@webiny/api-headless-cms/types";
2
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
3
+ import { FileModelProvider as Abstraction } from "../../domain/file/abstractions.js";
4
+ /**
5
+ * Resolves the tenant's `fmFile` model on demand.
6
+ *
7
+ * Two things this deliberately does NOT do, both of which the initializer it replaces did:
8
+ *
9
+ * - **No memoization.** `ModelsFetcher` already caches the model list per request (`ModelCache` is a
10
+ * per-request `createMemoryCache()`, see `ContentModelFeature`), so a second cache would buy only
11
+ * a repeat access-control check and an array lookup, at the cost of two lifetimes to reason about.
12
+ * - **No `withoutAuthorization`.** `fmFile` is a private model and `PrivateModelBuilder` sets
13
+ * `authorization: false`, which makes `AccessControl.modelAuthorizationDisabled()` short-circuit
14
+ * `canAccessModel()` to true for every identity — so the wrapper changed nothing. Confirmed
15
+ * against `filesSecurity.test.ts`, which exercises `fm.file`-only identities holding no CMS
16
+ * content-model permissions.
17
+ *
18
+ * `GetModelUseCase` is an ordinary constructor dependency: this provider is only constructed when a
19
+ * consumer first awaits `get()`, which happens during request handling — after the CMS has
20
+ * registered everything the use case needs. That timing is what previously forced the lazy
21
+ * `container.resolve()` inside the initializer.
22
+ */
23
+ declare class FileModelProviderImpl implements Abstraction.Interface {
24
+ private getModel;
25
+ constructor(getModel: GetModelUseCase.Interface);
26
+ get(): Promise<CmsModel>;
27
+ }
28
+ export declare const FileModelProvider: typeof FileModelProviderImpl & {
29
+ __abstraction: import("@webiny/di").Abstraction<import("~/domain/file/abstractions.js").IFileModelProvider>;
30
+ };
31
+ export {};
@@ -0,0 +1,22 @@
1
+ import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js";
2
+ import { FileModelProvider } from "../../domain/file/abstractions.js";
3
+ import { FILE_MODEL_ID } from "../../domain/file/file.model.js";
4
+ class FileModelProviderImpl {
5
+ constructor(getModel){
6
+ this.getModel = getModel;
7
+ }
8
+ async get() {
9
+ const result = await this.getModel.execute(FILE_MODEL_ID);
10
+ if (result.isFail()) throw result.error;
11
+ return result.value;
12
+ }
13
+ }
14
+ const FileModelProvider_FileModelProvider = FileModelProvider.createImplementation({
15
+ implementation: FileModelProviderImpl,
16
+ dependencies: [
17
+ GetModelUseCase
18
+ ]
19
+ });
20
+ export { FileModelProvider_FileModelProvider as FileModelProvider };
21
+
22
+ //# sourceMappingURL=FileModelProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/file/FileModelProvider.js","sources":["../../../src/features/file/FileModelProvider.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/api-headless-cms/types\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { FileModelProvider as Abstraction } from \"~/domain/file/abstractions.js\";\nimport { FILE_MODEL_ID } from \"~/domain/file/file.model.js\";\n\n/**\n * Resolves the tenant's `fmFile` model on demand.\n *\n * Two things this deliberately does NOT do, both of which the initializer it replaces did:\n *\n * - **No memoization.** `ModelsFetcher` already caches the model list per request (`ModelCache` is a\n * per-request `createMemoryCache()`, see `ContentModelFeature`), so a second cache would buy only\n * a repeat access-control check and an array lookup, at the cost of two lifetimes to reason about.\n * - **No `withoutAuthorization`.** `fmFile` is a private model and `PrivateModelBuilder` sets\n * `authorization: false`, which makes `AccessControl.modelAuthorizationDisabled()` short-circuit\n * `canAccessModel()` to true for every identity — so the wrapper changed nothing. Confirmed\n * against `filesSecurity.test.ts`, which exercises `fm.file`-only identities holding no CMS\n * content-model permissions.\n *\n * `GetModelUseCase` is an ordinary constructor dependency: this provider is only constructed when a\n * consumer first awaits `get()`, which happens during request handling — after the CMS has\n * registered everything the use case needs. That timing is what previously forced the lazy\n * `container.resolve()` inside the initializer.\n */\nclass FileModelProviderImpl implements Abstraction.Interface {\n constructor(private getModel: GetModelUseCase.Interface) {}\n\n async get(): Promise<CmsModel> {\n const result = await this.getModel.execute(FILE_MODEL_ID);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n }\n}\n\nexport const FileModelProvider = Abstraction.createImplementation({\n implementation: FileModelProviderImpl,\n dependencies: [GetModelUseCase]\n});\n"],"names":["FileModelProviderImpl","getModel","result","FILE_MODEL_ID","FileModelProvider","Abstraction","GetModelUseCase"],"mappings":";;;AAwBA,MAAMA;IACF,YAAoBC,QAAmC,CAAE;aAArCA,QAAQ,GAARA;IAAsC;IAE1D,MAAM,MAAyB;QAC3B,MAAMC,SAAS,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAACC;QAC3C,IAAID,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,OAAOA,OAAO,KAAK;IACvB;AACJ;AAEO,MAAME,sCAAoBC,kBAAAA,oBAAgC,CAAC;IAC9D,gBAAgBL;IAChB,cAAc;QAACM;KAAgB;AACnC"}
@@ -1,13 +1,10 @@
1
1
  import { FileUrlGenerator as Abstraction } from "./abstractions.js";
2
- import { GetSettingsUseCase } from "../../../features/settings/GetSettings/abstractions.js";
2
+ import { FileUrlPrefixProvider } from "./abstractions.js";
3
3
  import type { File } from "../../../domain/file/types.js";
4
4
  declare class FileUrlGeneratorImpl implements Abstraction.Interface {
5
- private readonly getSettings;
6
- private srcPrefix;
7
- constructor(getSettings: GetSettingsUseCase.Interface);
5
+ private readonly prefixProvider;
6
+ constructor(prefixProvider: FileUrlPrefixProvider.Interface);
8
7
  generateUrl(file: File): Promise<string>;
9
- private getPrefix;
10
- private fetchPrefix;
11
8
  }
12
9
  export declare const FileUrlGenerator: typeof FileUrlGeneratorImpl & {
13
10
  __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IFileUrlGenerator>;
@@ -1,31 +1,17 @@
1
- import { FileUrlGenerator } from "./abstractions.js";
2
- import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
1
+ import { FileUrlGenerator, FileUrlPrefixProvider } from "./abstractions.js";
3
2
  class FileUrlGeneratorImpl {
4
- constructor(getSettings){
5
- this.getSettings = getSettings;
3
+ constructor(prefixProvider){
4
+ this.prefixProvider = prefixProvider;
6
5
  }
7
6
  async generateUrl(file) {
8
- const prefix = await this.getPrefix();
7
+ const prefix = await this.prefixProvider.getPrefix();
9
8
  return prefix + file.key;
10
9
  }
11
- async getPrefix() {
12
- if (void 0 === this.srcPrefix) this.srcPrefix = this.fetchPrefix();
13
- return this.srcPrefix;
14
- }
15
- async fetchPrefix() {
16
- const result = await this.getSettings.execute();
17
- if (result.isFail()) {
18
- console.error("Failed to fetch settings:", result.error);
19
- return "";
20
- }
21
- const settings = result.value;
22
- return settings?.srcPrefix || "";
23
- }
24
10
  }
25
11
  const FileUrlGenerator_FileUrlGenerator = FileUrlGenerator.createImplementation({
26
12
  implementation: FileUrlGeneratorImpl,
27
13
  dependencies: [
28
- GetSettingsUseCase
14
+ FileUrlPrefixProvider
29
15
  ]
30
16
  });
31
17
  export { FileUrlGenerator_FileUrlGenerator as FileUrlGenerator };
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/FileUrlGenerator/FileUrlGenerator.js","sources":["../../../../src/features/file/FileUrlGenerator/FileUrlGenerator.ts"],"sourcesContent":["import { FileUrlGenerator as Abstraction } from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"~/features/settings/GetSettings/abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\n\nclass FileUrlGeneratorImpl implements Abstraction.Interface {\n private srcPrefix: Promise<string> | undefined;\n\n public constructor(private readonly getSettings: GetSettingsUseCase.Interface) {}\n\n public async generateUrl(file: File): Promise<string> {\n const prefix = await this.getPrefix();\n return prefix + file.key;\n }\n\n private async getPrefix(): Promise<string> {\n if (this.srcPrefix === undefined) {\n this.srcPrefix = this.fetchPrefix();\n }\n return this.srcPrefix;\n }\n\n private async fetchPrefix(): Promise<string> {\n const result = await this.getSettings.execute();\n if (result.isFail()) {\n console.error(\"Failed to fetch settings:\", result.error);\n return \"\";\n }\n const settings = result.value;\n return settings?.srcPrefix || \"\";\n }\n}\n\nexport const FileUrlGenerator = Abstraction.createImplementation({\n implementation: FileUrlGeneratorImpl,\n dependencies: [GetSettingsUseCase]\n});\n"],"names":["FileUrlGeneratorImpl","getSettings","file","prefix","undefined","result","console","settings","FileUrlGenerator","Abstraction","GetSettingsUseCase"],"mappings":";;AAIA,MAAMA;IAGF,YAAoCC,WAAyC,CAAE;aAA3CA,WAAW,GAAXA;IAA4C;IAEhF,MAAa,YAAYC,IAAU,EAAmB;QAClD,MAAMC,SAAS,MAAM,IAAI,CAAC,SAAS;QACnC,OAAOA,SAASD,KAAK,GAAG;IAC5B;IAEA,MAAc,YAA6B;QACvC,IAAI,AAAmBE,WAAnB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW;QAErC,OAAO,IAAI,CAAC,SAAS;IACzB;IAEA,MAAc,cAA+B;QACzC,MAAMC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QAC7C,IAAIA,OAAO,MAAM,IAAI;YACjBC,QAAQ,KAAK,CAAC,6BAA6BD,OAAO,KAAK;YACvD,OAAO;QACX;QACA,MAAME,WAAWF,OAAO,KAAK;QAC7B,OAAOE,UAAU,aAAa;IAClC;AACJ;AAEO,MAAMC,oCAAmBC,iBAAAA,oBAAgC,CAAC;IAC7D,gBAAgBT;IAChB,cAAc;QAACU;KAAmB;AACtC"}
1
+ {"version":3,"file":"features/file/FileUrlGenerator/FileUrlGenerator.js","sources":["../../../../src/features/file/FileUrlGenerator/FileUrlGenerator.ts"],"sourcesContent":["import { FileUrlGenerator as Abstraction } from \"./abstractions.js\";\nimport { FileUrlPrefixProvider } from \"./abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\n\nclass FileUrlGeneratorImpl implements Abstraction.Interface {\n public constructor(private readonly prefixProvider: FileUrlPrefixProvider.Interface) {}\n\n public async generateUrl(file: File): Promise<string> {\n const prefix = await this.prefixProvider.getPrefix();\n return prefix + file.key;\n }\n}\n\nexport const FileUrlGenerator = Abstraction.createImplementation({\n implementation: FileUrlGeneratorImpl,\n dependencies: [FileUrlPrefixProvider]\n});\n"],"names":["FileUrlGeneratorImpl","prefixProvider","file","prefix","FileUrlGenerator","Abstraction","FileUrlPrefixProvider"],"mappings":";AAIA,MAAMA;IACF,YAAoCC,cAA+C,CAAE;aAAjDA,cAAc,GAAdA;IAAkD;IAEtF,MAAa,YAAYC,IAAU,EAAmB;QAClD,MAAMC,SAAS,MAAM,IAAI,CAAC,cAAc,CAAC,SAAS;QAClD,OAAOA,SAASD,KAAK,GAAG;IAC5B;AACJ;AAEO,MAAME,oCAAmBC,iBAAAA,oBAAgC,CAAC;IAC7D,gBAAgBL;IAChB,cAAc;QAACM;KAAsB;AACzC"}
@@ -0,0 +1,13 @@
1
+ import { FileUrlPrefixProvider as Abstraction } from "./abstractions.js";
2
+ import { GetSettingsUseCase } from "../../../features/settings/GetSettings/abstractions.js";
3
+ declare class SettingsFileUrlPrefixProviderImpl implements Abstraction.Interface {
4
+ private readonly getSettings;
5
+ private prefix;
6
+ constructor(getSettings: GetSettingsUseCase.Interface);
7
+ getPrefix(): Promise<string>;
8
+ private loadPrefix;
9
+ }
10
+ export declare const SettingsFileUrlPrefixProvider: typeof SettingsFileUrlPrefixProviderImpl & {
11
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IFileUrlPrefixProvider>;
12
+ };
13
+ export {};
@@ -0,0 +1,29 @@
1
+ import { FileUrlPrefixProvider } from "./abstractions.js";
2
+ import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
3
+ class SettingsFileUrlPrefixProviderImpl {
4
+ constructor(getSettings){
5
+ this.getSettings = getSettings;
6
+ this.prefix = null;
7
+ }
8
+ getPrefix() {
9
+ if (!this.prefix) this.prefix = this.loadPrefix().catch((error)=>{
10
+ this.prefix = null;
11
+ throw error;
12
+ });
13
+ return this.prefix;
14
+ }
15
+ async loadPrefix() {
16
+ const result = await this.getSettings.execute();
17
+ if (result.isFail()) throw result.error;
18
+ return result.value?.srcPrefix ?? "";
19
+ }
20
+ }
21
+ const SettingsFileUrlPrefixProvider = FileUrlPrefixProvider.createImplementation({
22
+ implementation: SettingsFileUrlPrefixProviderImpl,
23
+ dependencies: [
24
+ GetSettingsUseCase
25
+ ]
26
+ });
27
+ export { SettingsFileUrlPrefixProvider };
28
+
29
+ //# sourceMappingURL=SettingsFileUrlPrefixProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js","sources":["../../../../src/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.ts"],"sourcesContent":["import { FileUrlPrefixProvider as Abstraction } from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"~/features/settings/GetSettings/abstractions.js\";\n\nclass SettingsFileUrlPrefixProviderImpl implements Abstraction.Interface {\n private prefix: Promise<string> | null = null;\n\n public constructor(private readonly getSettings: GetSettingsUseCase.Interface) {}\n\n // Read once per instance, when the first URL is needed. A failed read is forgotten, so the next\n // call tries again.\n public getPrefix(): Promise<string> {\n if (!this.prefix) {\n this.prefix = this.loadPrefix().catch(error => {\n this.prefix = null;\n throw error;\n });\n }\n return this.prefix;\n }\n\n private async loadPrefix(): Promise<string> {\n const result = await this.getSettings.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value?.srcPrefix ?? \"\";\n }\n}\n\nexport const SettingsFileUrlPrefixProvider = Abstraction.createImplementation({\n implementation: SettingsFileUrlPrefixProviderImpl,\n dependencies: [GetSettingsUseCase]\n});\n"],"names":["SettingsFileUrlPrefixProviderImpl","getSettings","error","result","SettingsFileUrlPrefixProvider","Abstraction","GetSettingsUseCase"],"mappings":";;AAGA,MAAMA;IAGF,YAAoCC,WAAyC,CAAE;aAA3CA,WAAW,GAAXA;aAF5B,MAAM,GAA2B;IAEuC;IAIzE,YAA6B;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EACZ,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,KAAK,CAACC,CAAAA;YAClC,IAAI,CAAC,MAAM,GAAG;YACd,MAAMA;QACV;QAEJ,OAAO,IAAI,CAAC,MAAM;IACtB;IAEA,MAAc,aAA8B;QACxC,MAAMC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QAC7C,IAAIA,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;QAEtB,OAAOA,OAAO,KAAK,EAAE,aAAa;IACtC;AACJ;AAEO,MAAMC,gCAAgCC,sBAAAA,oBAAgC,CAAC;IAC1E,gBAAgBL;IAChB,cAAc;QAACM;KAAmB;AACtC"}
@@ -6,3 +6,15 @@ export declare const FileUrlGenerator: import("@webiny/di").Abstraction<IFileUrl
6
6
  export declare namespace FileUrlGenerator {
7
7
  type Interface = IFileUrlGenerator;
8
8
  }
9
+ export interface IFileUrlPrefixProvider {
10
+ getPrefix(): Promise<string>;
11
+ }
12
+ /**
13
+ * Provides the prefix the default FileUrlGenerator puts in front of a file's key. The default
14
+ * implementation reads `srcPrefix` from the File Manager settings. Replace it to load the prefix
15
+ * from somewhere else, without touching how URLs are put together.
16
+ */
17
+ export declare const FileUrlPrefixProvider: import("@webiny/di").Abstraction<IFileUrlPrefixProvider>;
18
+ export declare namespace FileUrlPrefixProvider {
19
+ type Interface = IFileUrlPrefixProvider;
20
+ }
@@ -1,5 +1,6 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
2
  const FileUrlGenerator = createAbstraction("FileManager/FileUrlGenerator");
3
- export { FileUrlGenerator };
3
+ const FileUrlPrefixProvider = createAbstraction("FileManager/FileUrlPrefixProvider");
4
+ export { FileUrlGenerator, FileUrlPrefixProvider };
4
5
 
5
6
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/FileUrlGenerator/abstractions.js","sources":["../../../../src/features/file/FileUrlGenerator/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { File } from \"~/domain/file/types.js\";\n\nexport interface IFileUrlGenerator {\n generateUrl(file: File): Promise<string>;\n}\n\n/* Generate URLs for uploaded files. */\nexport const FileUrlGenerator = createAbstraction<IFileUrlGenerator>(\n \"FileManager/FileUrlGenerator\"\n);\n\nexport namespace FileUrlGenerator {\n export type Interface = IFileUrlGenerator;\n}\n"],"names":["FileUrlGenerator","createAbstraction"],"mappings":";AAQO,MAAMA,mBAAmBC,kBAC5B"}
1
+ {"version":3,"file":"features/file/FileUrlGenerator/abstractions.js","sources":["../../../../src/features/file/FileUrlGenerator/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { File } from \"~/domain/file/types.js\";\n\nexport interface IFileUrlGenerator {\n generateUrl(file: File): Promise<string>;\n}\n\n/* Generate URLs for uploaded files. */\nexport const FileUrlGenerator = createAbstraction<IFileUrlGenerator>(\n \"FileManager/FileUrlGenerator\"\n);\n\nexport namespace FileUrlGenerator {\n export type Interface = IFileUrlGenerator;\n}\n\nexport interface IFileUrlPrefixProvider {\n getPrefix(): Promise<string>;\n}\n\n/**\n * Provides the prefix the default FileUrlGenerator puts in front of a file's key. The default\n * implementation reads `srcPrefix` from the File Manager settings. Replace it to load the prefix\n * from somewhere else, without touching how URLs are put together.\n */\nexport const FileUrlPrefixProvider = createAbstraction<IFileUrlPrefixProvider>(\n \"FileManager/FileUrlPrefixProvider\"\n);\n\nexport namespace FileUrlPrefixProvider {\n export type Interface = IFileUrlPrefixProvider;\n}\n"],"names":["FileUrlGenerator","createAbstraction","FileUrlPrefixProvider"],"mappings":";AAQO,MAAMA,mBAAmBC,kBAC5B;AAgBG,MAAMC,wBAAwBD,kBACjC"}
@@ -1,9 +1,11 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { FileUrlGenerator } from "./FileUrlGenerator.js";
3
+ import { SettingsFileUrlPrefixProvider } from "./SettingsFileUrlPrefixProvider.js";
3
4
  const FileUrlGeneratorFeature = createFeature({
4
5
  name: "FileManager/FileUrlGenerator",
5
6
  register (container) {
6
7
  container.register(FileUrlGenerator).inSingletonScope();
8
+ container.register(SettingsFileUrlPrefixProvider).inSingletonScope();
7
9
  }
8
10
  });
9
11
  export { FileUrlGeneratorFeature };
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/FileUrlGenerator/feature.js","sources":["../../../../src/features/file/FileUrlGenerator/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { FileUrlGenerator } from \"./FileUrlGenerator.js\";\n\nexport const FileUrlGeneratorFeature = createFeature({\n name: \"FileManager/FileUrlGenerator\",\n register(container) {\n container.register(FileUrlGenerator).inSingletonScope();\n }\n});\n"],"names":["FileUrlGeneratorFeature","createFeature","container","FileUrlGenerator"],"mappings":";;AAGO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,kBAAkB,gBAAgB;IACzD;AACJ"}
1
+ {"version":3,"file":"features/file/FileUrlGenerator/feature.js","sources":["../../../../src/features/file/FileUrlGenerator/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { FileUrlGenerator } from \"./FileUrlGenerator.js\";\nimport { SettingsFileUrlPrefixProvider } from \"./SettingsFileUrlPrefixProvider.js\";\n\nexport const FileUrlGeneratorFeature = createFeature({\n name: \"FileManager/FileUrlGenerator\",\n register(container) {\n container.register(FileUrlGenerator).inSingletonScope();\n // A singleton, so the settings are read once per request however many URLs are generated.\n container.register(SettingsFileUrlPrefixProvider).inSingletonScope();\n }\n});\n"],"names":["FileUrlGeneratorFeature","createFeature","container","FileUrlGenerator","SettingsFileUrlPrefixProvider"],"mappings":";;;AAIO,MAAMA,0BAA0BC,cAAc;IACjD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,kBAAkB,gBAAgB;QAErDD,UAAU,QAAQ,CAACE,+BAA+B,gBAAgB;IACtE;AACJ"}
@@ -1 +1,2 @@
1
1
  export { FileUrlGenerator } from "./abstractions.js";
2
+ export { FileUrlPrefixProvider } from "./abstractions.js";
@@ -1 +1 @@
1
- export { FileUrlGenerator } from "./abstractions.js";
1
+ export { FileUrlGenerator, FileUrlPrefixProvider } from "./abstractions.js";
@@ -1,12 +1,12 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
3
3
  import { GetFileRepository as RepositoryAbstraction } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import type { File } from "../../../domain/file/types.js";
6
6
  declare class GetFileRepositoryImpl implements RepositoryAbstraction.Interface {
7
7
  private getEntryById;
8
- private fileModel;
9
- constructor(getEntryById: GetEntryByIdUseCase.Interface, fileModel: FileModel.Interface);
8
+ private fileModelProvider;
9
+ constructor(getEntryById: GetEntryByIdUseCase.Interface, fileModelProvider: FileModelProvider.Interface);
10
10
  execute(id: string): Promise<Result<File, RepositoryAbstraction.Error>>;
11
11
  }
12
12
  export declare const GetFileRepository: typeof GetFileRepositoryImpl & {
@@ -1,16 +1,17 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById";
3
3
  import { GetFileRepository } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import { FileNotAuthorizedError, FileNotFoundError, FilePersistenceError } from "../../../domain/file/errors.js";
6
6
  import { EntryToFileMapper } from "../shared/EntryToFileMapper.js";
7
7
  class GetFileRepositoryImpl {
8
- constructor(getEntryById, fileModel){
8
+ constructor(getEntryById, fileModelProvider){
9
9
  this.getEntryById = getEntryById;
10
- this.fileModel = fileModel;
10
+ this.fileModelProvider = fileModelProvider;
11
11
  }
12
12
  async execute(id) {
13
- const result = await this.getEntryById.execute(this.fileModel, `${id}#0001`);
13
+ const fileModel = await this.fileModelProvider.get();
14
+ const result = await this.getEntryById.execute(fileModel, `${id}#0001`);
14
15
  if (result.isFail()) {
15
16
  const error = result.error;
16
17
  if ("Cms/Entry/NotFound" === error.code) return Result.fail(new FileNotFoundError(id));
@@ -25,7 +26,7 @@ const GetFileRepository_GetFileRepository = GetFileRepository.createImplementati
25
26
  implementation: GetFileRepositoryImpl,
26
27
  dependencies: [
27
28
  GetEntryByIdUseCase,
28
- FileModel
29
+ FileModelProvider
29
30
  ]
30
31
  });
31
32
  export { GetFileRepository_GetFileRepository as GetFileRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/GetFile/GetFileRepository.js","sources":["../../../../src/features/file/GetFile/GetFileRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { GetFileRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { FileModel } from \"~/domain/file/abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\nimport {\n FileNotAuthorizedError,\n FileNotFoundError,\n FilePersistenceError\n} from \"~/domain/file/errors.js\";\nimport { EntryToFileMapper } from \"../shared/EntryToFileMapper.js\";\n\nclass GetFileRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private getEntryById: GetEntryByIdUseCase.Interface,\n private fileModel: FileModel.Interface\n ) {}\n\n async execute(id: string): Promise<Result<File, RepositoryAbstraction.Error>> {\n const result = await this.getEntryById.execute(this.fileModel, `${id}#0001`);\n\n if (result.isFail()) {\n const error = result.error;\n\n if (error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new FileNotFoundError(id));\n }\n\n if (error.code === \"Cms/Entry/NotAuthorized\") {\n return Result.fail(new FileNotAuthorizedError());\n }\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n const file = EntryToFileMapper.toFile(result.value);\n\n return Result.ok(file);\n }\n}\n\nexport const GetFileRepository = RepositoryAbstraction.createImplementation({\n implementation: GetFileRepositoryImpl,\n dependencies: [GetEntryByIdUseCase, FileModel]\n});\n"],"names":["GetFileRepositoryImpl","getEntryById","fileModel","id","result","error","Result","FileNotFoundError","FileNotAuthorizedError","FilePersistenceError","file","EntryToFileMapper","GetFileRepository","RepositoryAbstraction","GetEntryByIdUseCase","FileModel"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,YAA2C,EAC3CC,SAA8B,CACxC;aAFUD,YAAY,GAAZA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QAAQC,EAAU,EAAsD;QAC1E,MAAMC,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAGD,GAAG,KAAK,CAAC;QAE3E,IAAIC,OAAO,MAAM,IAAI;YACjB,MAAMC,QAAQD,OAAO,KAAK;YAE1B,IAAIC,AAAe,yBAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,kBAAkBJ;YAG7C,IAAIE,AAAe,8BAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIE;YAE3B,OAAOF,OAAO,IAAI,CAAC,IAAIG,qBAAqBL,OAAO,KAAK;QAC5D;QAEA,MAAMM,OAAOC,kBAAkB,MAAM,CAACP,OAAO,KAAK;QAElD,OAAOE,OAAO,EAAE,CAACI;IACrB;AACJ;AAEO,MAAME,sCAAoBC,kBAAAA,oBAA0C,CAAC;IACxE,gBAAgBb;IAChB,cAAc;QAACc;QAAqBC;KAAU;AAClD"}
1
+ {"version":3,"file":"features/file/GetFile/GetFileRepository.js","sources":["../../../../src/features/file/GetFile/GetFileRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { GetFileRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { FileModelProvider } from \"~/domain/file/abstractions.js\";\nimport type { File } from \"~/domain/file/types.js\";\nimport {\n FileNotAuthorizedError,\n FileNotFoundError,\n FilePersistenceError\n} from \"~/domain/file/errors.js\";\nimport { EntryToFileMapper } from \"../shared/EntryToFileMapper.js\";\n\nclass GetFileRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private getEntryById: GetEntryByIdUseCase.Interface,\n private fileModelProvider: FileModelProvider.Interface\n ) {}\n\n async execute(id: string): Promise<Result<File, RepositoryAbstraction.Error>> {\n const fileModel = await this.fileModelProvider.get();\n const result = await this.getEntryById.execute(fileModel, `${id}#0001`);\n\n if (result.isFail()) {\n const error = result.error;\n\n if (error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new FileNotFoundError(id));\n }\n\n if (error.code === \"Cms/Entry/NotAuthorized\") {\n return Result.fail(new FileNotAuthorizedError());\n }\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n const file = EntryToFileMapper.toFile(result.value);\n\n return Result.ok(file);\n }\n}\n\nexport const GetFileRepository = RepositoryAbstraction.createImplementation({\n implementation: GetFileRepositoryImpl,\n dependencies: [GetEntryByIdUseCase, FileModelProvider]\n});\n"],"names":["GetFileRepositoryImpl","getEntryById","fileModelProvider","id","fileModel","result","error","Result","FileNotFoundError","FileNotAuthorizedError","FilePersistenceError","file","EntryToFileMapper","GetFileRepository","RepositoryAbstraction","GetEntryByIdUseCase","FileModelProvider"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,YAA2C,EAC3CC,iBAA8C,CACxD;aAFUD,YAAY,GAAZA;aACAC,iBAAiB,GAAjBA;IACT;IAEH,MAAM,QAAQC,EAAU,EAAsD;QAC1E,MAAMC,YAAY,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAClD,MAAMC,SAAS,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAACD,WAAW,GAAGD,GAAG,KAAK,CAAC;QAEtE,IAAIE,OAAO,MAAM,IAAI;YACjB,MAAMC,QAAQD,OAAO,KAAK;YAE1B,IAAIC,AAAe,yBAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,kBAAkBL;YAG7C,IAAIG,AAAe,8BAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIE;YAE3B,OAAOF,OAAO,IAAI,CAAC,IAAIG,qBAAqBL,OAAO,KAAK;QAC5D;QAEA,MAAMM,OAAOC,kBAAkB,MAAM,CAACP,OAAO,KAAK;QAElD,OAAOE,OAAO,EAAE,CAACI;IACrB;AACJ;AAEO,MAAME,sCAAoBC,kBAAAA,oBAA0C,CAAC;IACxE,gBAAgBd;IAChB,cAAc;QAACe;QAAqBC;KAAkB;AAC1D"}
@@ -1,15 +1,15 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
3
3
  import { ListFilesInput, ListFilesOutput, ListFilesRepository as RepositoryAbstraction } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import { CmsWhereMapper } from "@webiny/api-headless-cms";
6
6
  import { CmsSortMapper } from "@webiny/api-headless-cms";
7
7
  declare class ListFilesRepositoryImpl implements RepositoryAbstraction.Interface {
8
8
  private listLatestEntries;
9
- private fileModel;
9
+ private fileModelProvider;
10
10
  private cmsWhereMapper;
11
11
  private cmsSortMapper;
12
- constructor(listLatestEntries: ListLatestEntriesUseCase.Interface, fileModel: FileModel.Interface, cmsWhereMapper: CmsWhereMapper.Interface, cmsSortMapper: CmsSortMapper.Interface);
12
+ constructor(listLatestEntries: ListLatestEntriesUseCase.Interface, fileModelProvider: FileModelProvider.Interface, cmsWhereMapper: CmsWhereMapper.Interface, cmsSortMapper: CmsSortMapper.Interface);
13
13
  execute(input: ListFilesInput): Promise<Result<ListFilesOutput, RepositoryAbstraction.Error>>;
14
14
  }
15
15
  export declare const ListFilesRepository: typeof ListFilesRepositoryImpl & {
@@ -1,27 +1,28 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js";
3
3
  import { ListFilesRepository } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import { FilePersistenceError } from "../../../domain/file/errors.js";
6
6
  import { EntryToFileMapper } from "../shared/EntryToFileMapper.js";
7
7
  import { CmsSortMapper, CmsWhereMapper } from "@webiny/api-headless-cms";
8
8
  class ListFilesRepositoryImpl {
9
- constructor(listLatestEntries, fileModel, cmsWhereMapper, cmsSortMapper){
9
+ constructor(listLatestEntries, fileModelProvider, cmsWhereMapper, cmsSortMapper){
10
10
  this.listLatestEntries = listLatestEntries;
11
- this.fileModel = fileModel;
11
+ this.fileModelProvider = fileModelProvider;
12
12
  this.cmsWhereMapper = cmsWhereMapper;
13
13
  this.cmsSortMapper = cmsSortMapper;
14
14
  }
15
15
  async execute(input) {
16
+ const fileModel = await this.fileModelProvider.get();
16
17
  const where = this.cmsWhereMapper.map({
17
18
  input: input.where || {},
18
- fields: this.fileModel.fields
19
+ fields: fileModel.fields
19
20
  });
20
21
  const sort = this.cmsSortMapper.map({
21
22
  input: input.sort,
22
- fields: this.fileModel.fields
23
+ fields: fileModel.fields
23
24
  });
24
- const result = await this.listLatestEntries.execute(this.fileModel, {
25
+ const result = await this.listLatestEntries.execute(fileModel, {
25
26
  where,
26
27
  limit: input.limit || 40,
27
28
  after: input.after || void 0,
@@ -43,7 +44,7 @@ const ListFilesRepository_ListFilesRepository = ListFilesRepository.createImplem
43
44
  implementation: ListFilesRepositoryImpl,
44
45
  dependencies: [
45
46
  ListLatestEntriesUseCase,
46
- FileModel,
47
+ FileModelProvider,
47
48
  CmsWhereMapper,
48
49
  CmsSortMapper
49
50
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/ListFiles/ListFilesRepository.js","sources":["../../../../src/features/file/ListFiles/ListFilesRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport {\n ListFilesInput,\n ListFilesOutput,\n ListFilesRepository as RepositoryAbstraction\n} from \"./abstractions.js\";\nimport { FileModel } from \"~/domain/file/abstractions.js\";\nimport { FilePersistenceError } from \"~/domain/file/errors.js\";\nimport { EntryToFileMapper } from \"../shared/EntryToFileMapper.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { CmsSortMapper } from \"@webiny/api-headless-cms\";\nimport { GenericRecord } from \"@webiny/api/types.js\";\n\nclass ListFilesRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private fileModel: FileModel.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface,\n private cmsSortMapper: CmsSortMapper.Interface\n ) {}\n\n async execute(\n input: ListFilesInput\n ): Promise<Result<ListFilesOutput, RepositoryAbstraction.Error>> {\n const where = this.cmsWhereMapper.map<GenericRecord>({\n input: input.where || {},\n fields: this.fileModel.fields\n });\n\n const sort = this.cmsSortMapper.map({\n input: input.sort,\n fields: this.fileModel.fields\n });\n\n const result = await this.listLatestEntries.execute(this.fileModel, {\n where,\n limit: input.limit || 40,\n after: input.after || undefined,\n sort: sort || [\"id_DESC\"],\n search: input.search\n });\n\n if (result.isFail()) {\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n const { entries, meta } = result.value;\n\n const files = entries.map(entry => EntryToFileMapper.toFile(entry));\n\n return Result.ok({\n items: files,\n meta\n });\n }\n}\n\nexport const ListFilesRepository = RepositoryAbstraction.createImplementation({\n implementation: ListFilesRepositoryImpl,\n dependencies: [ListLatestEntriesUseCase, FileModel, CmsWhereMapper, CmsSortMapper]\n});\n"],"names":["ListFilesRepositoryImpl","listLatestEntries","fileModel","cmsWhereMapper","cmsSortMapper","input","where","sort","result","undefined","Result","FilePersistenceError","entries","meta","files","entry","EntryToFileMapper","ListFilesRepository","RepositoryAbstraction","ListLatestEntriesUseCase","FileModel","CmsWhereMapper","CmsSortMapper"],"mappings":";;;;;;;AAcA,MAAMA;IACF,YACYC,iBAAqD,EACrDC,SAA8B,EAC9BC,cAAwC,EACxCC,aAAsC,CAChD;aAJUH,iBAAiB,GAAjBA;aACAC,SAAS,GAATA;aACAC,cAAc,GAAdA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QACFC,KAAqB,EACwC;QAC7D,MAAMC,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAgB;YACjD,OAAOD,MAAM,KAAK,IAAI,CAAC;YACvB,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM;QACjC;QAEA,MAAME,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAChC,OAAOF,MAAM,IAAI;YACjB,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM;QACjC;QAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YAChEF;YACA,OAAOD,MAAM,KAAK,IAAI;YACtB,OAAOA,MAAM,KAAK,IAAII;YACtB,MAAMF,QAAQ;gBAAC;aAAU;YACzB,QAAQF,MAAM,MAAM;QACxB;QAEA,IAAIG,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAAC,IAAIC,qBAAqBH,OAAO,KAAK;QAG5D,MAAM,EAAEI,OAAO,EAAEC,IAAI,EAAE,GAAGL,OAAO,KAAK;QAEtC,MAAMM,QAAQF,QAAQ,GAAG,CAACG,CAAAA,QAASC,kBAAkB,MAAM,CAACD;QAE5D,OAAOL,OAAO,EAAE,CAAC;YACb,OAAOI;YACPD;QACJ;IACJ;AACJ;AAEO,MAAMI,0CAAsBC,oBAAAA,oBAA0C,CAAC;IAC1E,gBAAgBlB;IAChB,cAAc;QAACmB;QAA0BC;QAAWC;QAAgBC;KAAc;AACtF"}
1
+ {"version":3,"file":"features/file/ListFiles/ListFilesRepository.js","sources":["../../../../src/features/file/ListFiles/ListFilesRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/index.js\";\nimport {\n ListFilesInput,\n ListFilesOutput,\n ListFilesRepository as RepositoryAbstraction\n} from \"./abstractions.js\";\nimport { FileModelProvider } from \"~/domain/file/abstractions.js\";\nimport { FilePersistenceError } from \"~/domain/file/errors.js\";\nimport { EntryToFileMapper } from \"../shared/EntryToFileMapper.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { CmsSortMapper } from \"@webiny/api-headless-cms\";\nimport { GenericRecord } from \"@webiny/api/types.js\";\n\nclass ListFilesRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private listLatestEntries: ListLatestEntriesUseCase.Interface,\n private fileModelProvider: FileModelProvider.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface,\n private cmsSortMapper: CmsSortMapper.Interface\n ) {}\n\n async execute(\n input: ListFilesInput\n ): Promise<Result<ListFilesOutput, RepositoryAbstraction.Error>> {\n const fileModel = await this.fileModelProvider.get();\n\n const where = this.cmsWhereMapper.map<GenericRecord>({\n input: input.where || {},\n fields: fileModel.fields\n });\n\n const sort = this.cmsSortMapper.map({\n input: input.sort,\n fields: fileModel.fields\n });\n\n const result = await this.listLatestEntries.execute(fileModel, {\n where,\n limit: input.limit || 40,\n after: input.after || undefined,\n sort: sort || [\"id_DESC\"],\n search: input.search\n });\n\n if (result.isFail()) {\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n const { entries, meta } = result.value;\n\n const files = entries.map(entry => EntryToFileMapper.toFile(entry));\n\n return Result.ok({\n items: files,\n meta\n });\n }\n}\n\nexport const ListFilesRepository = RepositoryAbstraction.createImplementation({\n implementation: ListFilesRepositoryImpl,\n dependencies: [ListLatestEntriesUseCase, FileModelProvider, CmsWhereMapper, CmsSortMapper]\n});\n"],"names":["ListFilesRepositoryImpl","listLatestEntries","fileModelProvider","cmsWhereMapper","cmsSortMapper","input","fileModel","where","sort","result","undefined","Result","FilePersistenceError","entries","meta","files","entry","EntryToFileMapper","ListFilesRepository","RepositoryAbstraction","ListLatestEntriesUseCase","FileModelProvider","CmsWhereMapper","CmsSortMapper"],"mappings":";;;;;;;AAcA,MAAMA;IACF,YACYC,iBAAqD,EACrDC,iBAA8C,EAC9CC,cAAwC,EACxCC,aAAsC,CAChD;aAJUH,iBAAiB,GAAjBA;aACAC,iBAAiB,GAAjBA;aACAC,cAAc,GAAdA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QACFC,KAAqB,EACwC;QAC7D,MAAMC,YAAY,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAElD,MAAMC,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAgB;YACjD,OAAOF,MAAM,KAAK,IAAI,CAAC;YACvB,QAAQC,UAAU,MAAM;QAC5B;QAEA,MAAME,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAChC,OAAOH,MAAM,IAAI;YACjB,QAAQC,UAAU,MAAM;QAC5B;QAEA,MAAMG,SAAS,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACH,WAAW;YAC3DC;YACA,OAAOF,MAAM,KAAK,IAAI;YACtB,OAAOA,MAAM,KAAK,IAAIK;YACtB,MAAMF,QAAQ;gBAAC;aAAU;YACzB,QAAQH,MAAM,MAAM;QACxB;QAEA,IAAII,OAAO,MAAM,IACb,OAAOE,OAAO,IAAI,CAAC,IAAIC,qBAAqBH,OAAO,KAAK;QAG5D,MAAM,EAAEI,OAAO,EAAEC,IAAI,EAAE,GAAGL,OAAO,KAAK;QAEtC,MAAMM,QAAQF,QAAQ,GAAG,CAACG,CAAAA,QAASC,kBAAkB,MAAM,CAACD;QAE5D,OAAOL,OAAO,EAAE,CAAC;YACb,OAAOI;YACPD;QACJ;IACJ;AACJ;AAEO,MAAMI,0CAAsBC,oBAAAA,oBAA0C,CAAC;IAC1E,gBAAgBnB;IAChB,cAAc;QAACoB;QAA0BC;QAAmBC;QAAgBC;KAAc;AAC9F"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { type IAiSdkTool } from "@webiny/api-core/features/ai/index.js";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
3
  import { ListFilesUseCase } from "../../../features/file/ListFiles/index.js";
4
4
  declare const inputSchema: z.ZodObject<{
5
5
  tag: z.ZodString;
@@ -11,17 +11,27 @@ interface ImageItem {
11
11
  type: string;
12
12
  tags: string[];
13
13
  }
14
- declare class ListImagesByTagToolImpl implements IAiSdkTool<Input> {
14
+ declare class ListImagesByTagToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {
15
15
  private listFiles;
16
+ constructor(listFiles: ListFilesUseCase.Interface);
17
+ execute(input: Input): Promise<ImageItem[]>;
18
+ }
19
+ declare class ListImagesByTagToolImpl implements AiSdkToolDefinition.Interface<Input> {
16
20
  readonly name = "listImagesByTag";
21
+ readonly title = "List images by tag";
17
22
  readonly description = "Lists images from the file manager filtered by a given tag. Returns name, type, and tags for each image.";
18
23
  readonly inputSchema: z.ZodObject<{
19
24
  tag: z.ZodString;
20
25
  }, z.core.$strip>;
21
- constructor(listFiles: ListFilesUseCase.Interface);
22
- execute(input: Input): Promise<ImageItem[]>;
26
+ readonly annotations: {
27
+ readOnlyHint: boolean;
28
+ idempotentHint: boolean;
29
+ };
30
+ readonly handler: typeof ListImagesByTagToolHandlerImpl & {
31
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolHandler<any>>;
32
+ };
23
33
  }
24
34
  export declare const ListImagesByTagTool: typeof ListImagesByTagToolImpl & {
25
- __abstraction: import("@webiny/di").Abstraction<IAiSdkTool<any>>;
35
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/ai/abstractions").IAiSdkToolDefinition<any>>;
26
36
  };
27
37
  export {};
@@ -1,15 +1,12 @@
1
1
  import { z } from "zod";
2
- import { AiSdkTool } from "@webiny/api-core/features/ai/index.js";
2
+ import { AiSdkToolDefinition, AiSdkToolHandler } from "@webiny/api-core/features/ai/index.js";
3
3
  import { ListFilesUseCase } from "../ListFiles/index.js";
4
4
  const inputSchema = z.object({
5
5
  tag: z.string().describe("Tag to filter images by")
6
6
  });
7
- class ListImagesByTagToolImpl {
7
+ class ListImagesByTagToolHandlerImpl {
8
8
  constructor(listFiles){
9
9
  this.listFiles = listFiles;
10
- this.name = "listImagesByTag";
11
- this.description = "Lists images from the file manager filtered by a given tag. Returns name, type, and tags for each image.";
12
- this.inputSchema = inputSchema;
13
10
  }
14
11
  async execute(input) {
15
12
  console.log("Call images tool", input);
@@ -31,12 +28,29 @@ class ListImagesByTagToolImpl {
31
28
  }));
32
29
  }
33
30
  }
34
- const ListImagesByTagTool = AiSdkTool.createImplementation({
35
- implementation: ListImagesByTagToolImpl,
31
+ const ListImagesByTagToolHandler = AiSdkToolHandler.createImplementation({
32
+ implementation: ListImagesByTagToolHandlerImpl,
36
33
  dependencies: [
37
34
  ListFilesUseCase
38
35
  ]
39
36
  });
37
+ class ListImagesByTagToolImpl {
38
+ constructor(){
39
+ this.name = "listImagesByTag";
40
+ this.title = "List images by tag";
41
+ this.description = "Lists images from the file manager filtered by a given tag. Returns name, type, and tags for each image.";
42
+ this.inputSchema = inputSchema;
43
+ this.annotations = {
44
+ readOnlyHint: true,
45
+ idempotentHint: true
46
+ };
47
+ this.handler = ListImagesByTagToolHandler;
48
+ }
49
+ }
50
+ const ListImagesByTagTool = AiSdkToolDefinition.createImplementation({
51
+ implementation: ListImagesByTagToolImpl,
52
+ dependencies: []
53
+ });
40
54
  export { ListImagesByTagTool };
41
55
 
42
56
  //# sourceMappingURL=ListImagesByTagTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/ListImagesByTagTool/ListImagesByTagTool.js","sources":["../../../../src/features/file/ListImagesByTagTool/ListImagesByTagTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkTool, type IAiSdkTool } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListFilesUseCase } from \"~/features/file/ListFiles/index.js\";\n\nconst inputSchema = z.object({\n tag: z.string().describe(\"Tag to filter images by\")\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface ImageItem {\n id: string;\n name: string;\n type: string;\n tags: string[];\n}\n\nclass ListImagesByTagToolImpl implements IAiSdkTool<Input> {\n readonly name = \"listImagesByTag\";\n readonly description =\n \"Lists images from the file manager filtered by a given tag. Returns name, type, and tags for each image.\";\n readonly inputSchema = inputSchema;\n\n constructor(private listFiles: ListFilesUseCase.Interface) {}\n\n async execute(input: Input): Promise<ImageItem[]> {\n console.log(\"Call images tool\", input);\n const result = await this.listFiles.execute({\n where: {\n type_startsWith: \"image/\",\n tags_in: [input.tag]\n },\n limit: 50\n });\n\n if (result.isFail()) {\n return [];\n }\n\n return result.value.items.map(file => ({\n id: file.id,\n name: file.name,\n type: file.type,\n tags: file.tags\n }));\n }\n}\n\nexport const ListImagesByTagTool = AiSdkTool.createImplementation({\n implementation: ListImagesByTagToolImpl,\n dependencies: [ListFilesUseCase]\n});\n"],"names":["inputSchema","z","ListImagesByTagToolImpl","listFiles","input","console","result","file","ListImagesByTagTool","AiSdkTool","ListFilesUseCase"],"mappings":";;;AAIA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,KAAKA,EAAE,MAAM,GAAG,QAAQ,CAAC;AAC7B;AAWA,MAAMC;IAMF,YAAoBC,SAAqC,CAAE;aAAvCA,SAAS,GAATA;aALX,IAAI,GAAG;aACP,WAAW,GAChB;aACK,WAAW,GAAGH;IAEqC;IAE5D,MAAM,QAAQI,KAAY,EAAwB;QAC9CC,QAAQ,GAAG,CAAC,oBAAoBD;QAChC,MAAME,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACxC,OAAO;gBACH,iBAAiB;gBACjB,SAAS;oBAACF,MAAM,GAAG;iBAAC;YACxB;YACA,OAAO;QACX;QAEA,IAAIE,OAAO,MAAM,IACb,OAAO,EAAE;QAGb,OAAOA,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAACC,CAAAA,OAAS;gBACnC,IAAIA,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;YACnB;IACJ;AACJ;AAEO,MAAMC,sBAAsBC,UAAU,oBAAoB,CAAC;IAC9D,gBAAgBP;IAChB,cAAc;QAACQ;KAAiB;AACpC"}
1
+ {"version":3,"file":"features/file/ListImagesByTagTool/ListImagesByTagTool.js","sources":["../../../../src/features/file/ListImagesByTagTool/ListImagesByTagTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { AiSdkToolDefinition, AiSdkToolHandler } from \"@webiny/api-core/features/ai/index.js\";\nimport { ListFilesUseCase } from \"~/features/file/ListFiles/index.js\";\n\nconst inputSchema = z.object({\n tag: z.string().describe(\"Tag to filter images by\")\n});\n\ntype Input = z.infer<typeof inputSchema>;\n\ninterface ImageItem {\n id: string;\n name: string;\n type: string;\n tags: string[];\n}\n\nclass ListImagesByTagToolHandlerImpl implements AiSdkToolHandler.Interface<Input> {\n constructor(private listFiles: ListFilesUseCase.Interface) {}\n\n async execute(input: Input): Promise<ImageItem[]> {\n console.log(\"Call images tool\", input);\n const result = await this.listFiles.execute({\n where: {\n type_startsWith: \"image/\",\n tags_in: [input.tag]\n },\n limit: 50\n });\n\n if (result.isFail()) {\n return [];\n }\n\n return result.value.items.map(file => ({\n id: file.id,\n name: file.name,\n type: file.type,\n tags: file.tags\n }));\n }\n}\n\nconst ListImagesByTagToolHandler = AiSdkToolHandler.createImplementation({\n implementation: ListImagesByTagToolHandlerImpl,\n dependencies: [ListFilesUseCase]\n});\n\nclass ListImagesByTagToolImpl implements AiSdkToolDefinition.Interface<Input> {\n readonly name = \"listImagesByTag\";\n readonly title = \"List images by tag\";\n readonly description =\n \"Lists images from the file manager filtered by a given tag. Returns name, type, and tags for each image.\";\n readonly inputSchema = inputSchema;\n readonly annotations = { readOnlyHint: true, idempotentHint: true };\n readonly handler = ListImagesByTagToolHandler;\n}\n\nexport const ListImagesByTagTool = AiSdkToolDefinition.createImplementation({\n implementation: ListImagesByTagToolImpl,\n dependencies: []\n});\n"],"names":["inputSchema","z","ListImagesByTagToolHandlerImpl","listFiles","input","console","result","file","ListImagesByTagToolHandler","AiSdkToolHandler","ListFilesUseCase","ListImagesByTagToolImpl","ListImagesByTagTool","AiSdkToolDefinition"],"mappings":";;;AAIA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,KAAKA,EAAE,MAAM,GAAG,QAAQ,CAAC;AAC7B;AAWA,MAAMC;IACF,YAAoBC,SAAqC,CAAE;aAAvCA,SAAS,GAATA;IAAwC;IAE5D,MAAM,QAAQC,KAAY,EAAwB;QAC9CC,QAAQ,GAAG,CAAC,oBAAoBD;QAChC,MAAME,SAAS,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACxC,OAAO;gBACH,iBAAiB;gBACjB,SAAS;oBAACF,MAAM,GAAG;iBAAC;YACxB;YACA,OAAO;QACX;QAEA,IAAIE,OAAO,MAAM,IACb,OAAO,EAAE;QAGb,OAAOA,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAACC,CAAAA,OAAS;gBACnC,IAAIA,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;YACnB;IACJ;AACJ;AAEA,MAAMC,6BAA6BC,iBAAiB,oBAAoB,CAAC;IACrE,gBAAgBP;IAChB,cAAc;QAACQ;KAAiB;AACpC;AAEA,MAAMC;;aACO,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAGX;aACd,WAAW,GAAG;YAAE,cAAc;YAAM,gBAAgB;QAAK;aACzD,OAAO,GAAGQ;;AACvB;AAEO,MAAMI,sBAAsBC,oBAAoB,oBAAoB,CAAC;IACxE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -1,13 +1,13 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetUniqueFieldValuesUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetUniqueFieldValues";
3
3
  import { ListTagsInput, ListTagsRepository as RepositoryAbstraction, TagItem } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import { CmsWhereMapper } from "@webiny/api-headless-cms";
6
6
  declare class ListTagsRepositoryImpl implements RepositoryAbstraction.Interface {
7
7
  private getUniqueFieldValues;
8
- private fileModel;
8
+ private fileModelProvider;
9
9
  private cmsWhereMapper;
10
- constructor(getUniqueFieldValues: GetUniqueFieldValuesUseCase.Interface, fileModel: FileModel.Interface, cmsWhereMapper: CmsWhereMapper.Interface);
10
+ constructor(getUniqueFieldValues: GetUniqueFieldValuesUseCase.Interface, fileModelProvider: FileModelProvider.Interface, cmsWhereMapper: CmsWhereMapper.Interface);
11
11
  execute(input: ListTagsInput): Promise<Result<TagItem[], RepositoryAbstraction.Error>>;
12
12
  }
13
13
  export declare const ListTagsRepository: typeof ListTagsRepositoryImpl & {
@@ -1,24 +1,25 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { GetUniqueFieldValuesUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetUniqueFieldValues";
3
3
  import { ListTagsRepository } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import { FilePersistenceError } from "../../../domain/file/errors.js";
6
6
  import { CmsWhereMapper } from "@webiny/api-headless-cms";
7
7
  class ListTagsRepositoryImpl {
8
- constructor(getUniqueFieldValues, fileModel, cmsWhereMapper){
8
+ constructor(getUniqueFieldValues, fileModelProvider, cmsWhereMapper){
9
9
  this.getUniqueFieldValues = getUniqueFieldValues;
10
- this.fileModel = fileModel;
10
+ this.fileModelProvider = fileModelProvider;
11
11
  this.cmsWhereMapper = cmsWhereMapper;
12
12
  }
13
13
  async execute(input) {
14
- const result = await this.getUniqueFieldValues.execute(this.fileModel, {
14
+ const fileModel = await this.fileModelProvider.get();
15
+ const result = await this.getUniqueFieldValues.execute(fileModel, {
15
16
  fieldId: "tags",
16
17
  where: this.cmsWhereMapper.map({
17
18
  input: {
18
19
  ...input.where || {},
19
20
  latest: true
20
21
  },
21
- fields: this.fileModel.fields
22
+ fields: fileModel.fields
22
23
  })
23
24
  });
24
25
  if (result.isFail()) return Result.fail(new FilePersistenceError(result.error));
@@ -33,7 +34,7 @@ const ListTagsRepository_ListTagsRepository = ListTagsRepository.createImplement
33
34
  implementation: ListTagsRepositoryImpl,
34
35
  dependencies: [
35
36
  GetUniqueFieldValuesUseCase,
36
- FileModel,
37
+ FileModelProvider,
37
38
  CmsWhereMapper
38
39
  ]
39
40
  });
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/ListTags/ListTagsRepository.js","sources":["../../../../src/features/file/ListTags/ListTagsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetUniqueFieldValuesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetUniqueFieldValues\";\nimport {\n ListTagsInput,\n ListTagsRepository as RepositoryAbstraction,\n TagItem\n} from \"./abstractions.js\";\nimport { FileModel } from \"~/domain/file/abstractions.js\";\nimport { FilePersistenceError } from \"~/domain/file/errors.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\n\nclass ListTagsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private getUniqueFieldValues: GetUniqueFieldValuesUseCase.Interface,\n private fileModel: FileModel.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface\n ) {}\n\n async execute(input: ListTagsInput): Promise<Result<TagItem[], RepositoryAbstraction.Error>> {\n const result = await this.getUniqueFieldValues.execute(this.fileModel, {\n fieldId: \"tags\",\n // TODO fix with proper types\n // @ts-expect-error\n where: this.cmsWhereMapper.map({\n input: {\n ...(input.where || {}),\n latest: true\n },\n fields: this.fileModel.fields\n })\n });\n\n if (result.isFail()) {\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n // Map to TagItem format\n const tags: TagItem[] = result.value\n .map(uv => ({\n tag: uv.value as string,\n count: uv.count\n }))\n // Sort by tag name alphabetically\n .sort((a, b) => (a.tag < b.tag ? -1 : 1))\n // Then sort by count descending (most used first)\n .sort((a, b) => (a.count > b.count ? -1 : 1));\n\n return Result.ok(tags);\n }\n}\n\nexport const ListTagsRepository = RepositoryAbstraction.createImplementation({\n implementation: ListTagsRepositoryImpl,\n dependencies: [GetUniqueFieldValuesUseCase, FileModel, CmsWhereMapper]\n});\n"],"names":["ListTagsRepositoryImpl","getUniqueFieldValues","fileModel","cmsWhereMapper","input","result","Result","FilePersistenceError","tags","uv","a","b","ListTagsRepository","RepositoryAbstraction","GetUniqueFieldValuesUseCase","FileModel","CmsWhereMapper"],"mappings":";;;;;;AAWA,MAAMA;IACF,YACYC,oBAA2D,EAC3DC,SAA8B,EAC9BC,cAAwC,CAClD;aAHUF,oBAAoB,GAApBA;aACAC,SAAS,GAATA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QAAQC,KAAoB,EAA2D;QACzF,MAAMC,SAAS,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE;YACnE,SAAS;YAGT,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBAC3B,OAAO;oBACH,GAAID,MAAM,KAAK,IAAI,CAAC,CAAC;oBACrB,QAAQ;gBACZ;gBACA,QAAQ,IAAI,CAAC,SAAS,CAAC,MAAM;YACjC;QACJ;QAEA,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,qBAAqBF,OAAO,KAAK;QAI5D,MAAMG,OAAkBH,OAAO,KAAK,CAC/B,GAAG,CAACI,CAAAA,KAAO;gBACR,KAAKA,GAAG,KAAK;gBACb,OAAOA,GAAG,KAAK;YACnB,IAEC,IAAI,CAAC,CAACC,GAAGC,IAAOD,EAAE,GAAG,GAAGC,EAAE,GAAG,GAAG,KAAK,GAErC,IAAI,CAAC,CAACD,GAAGC,IAAOD,EAAE,KAAK,GAAGC,EAAE,KAAK,GAAG,KAAK;QAE9C,OAAOL,OAAO,EAAE,CAACE;IACrB;AACJ;AAEO,MAAMI,wCAAqBC,mBAAAA,oBAA0C,CAAC;IACzE,gBAAgBb;IAChB,cAAc;QAACc;QAA6BC;QAAWC;KAAe;AAC1E"}
1
+ {"version":3,"file":"features/file/ListTags/ListTagsRepository.js","sources":["../../../../src/features/file/ListTags/ListTagsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetUniqueFieldValuesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetUniqueFieldValues\";\nimport {\n ListTagsInput,\n ListTagsRepository as RepositoryAbstraction,\n TagItem\n} from \"./abstractions.js\";\nimport { FileModelProvider } from \"~/domain/file/abstractions.js\";\nimport { FilePersistenceError } from \"~/domain/file/errors.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\n\nclass ListTagsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private getUniqueFieldValues: GetUniqueFieldValuesUseCase.Interface,\n private fileModelProvider: FileModelProvider.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface\n ) {}\n\n async execute(input: ListTagsInput): Promise<Result<TagItem[], RepositoryAbstraction.Error>> {\n const fileModel = await this.fileModelProvider.get();\n\n const result = await this.getUniqueFieldValues.execute(fileModel, {\n fieldId: \"tags\",\n // TODO fix with proper types\n // @ts-expect-error\n where: this.cmsWhereMapper.map({\n input: {\n ...(input.where || {}),\n latest: true\n },\n fields: fileModel.fields\n })\n });\n\n if (result.isFail()) {\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n // Map to TagItem format\n const tags: TagItem[] = result.value\n .map(uv => ({\n tag: uv.value as string,\n count: uv.count\n }))\n // Sort by tag name alphabetically\n .sort((a, b) => (a.tag < b.tag ? -1 : 1))\n // Then sort by count descending (most used first)\n .sort((a, b) => (a.count > b.count ? -1 : 1));\n\n return Result.ok(tags);\n }\n}\n\nexport const ListTagsRepository = RepositoryAbstraction.createImplementation({\n implementation: ListTagsRepositoryImpl,\n dependencies: [GetUniqueFieldValuesUseCase, FileModelProvider, CmsWhereMapper]\n});\n"],"names":["ListTagsRepositoryImpl","getUniqueFieldValues","fileModelProvider","cmsWhereMapper","input","fileModel","result","Result","FilePersistenceError","tags","uv","a","b","ListTagsRepository","RepositoryAbstraction","GetUniqueFieldValuesUseCase","FileModelProvider","CmsWhereMapper"],"mappings":";;;;;;AAWA,MAAMA;IACF,YACYC,oBAA2D,EAC3DC,iBAA8C,EAC9CC,cAAwC,CAClD;aAHUF,oBAAoB,GAApBA;aACAC,iBAAiB,GAAjBA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QAAQC,KAAoB,EAA2D;QACzF,MAAMC,YAAY,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAElD,MAAMC,SAAS,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAACD,WAAW;YAC9D,SAAS;YAGT,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;gBAC3B,OAAO;oBACH,GAAID,MAAM,KAAK,IAAI,CAAC,CAAC;oBACrB,QAAQ;gBACZ;gBACA,QAAQC,UAAU,MAAM;YAC5B;QACJ;QAEA,IAAIC,OAAO,MAAM,IACb,OAAOC,OAAO,IAAI,CAAC,IAAIC,qBAAqBF,OAAO,KAAK;QAI5D,MAAMG,OAAkBH,OAAO,KAAK,CAC/B,GAAG,CAACI,CAAAA,KAAO;gBACR,KAAKA,GAAG,KAAK;gBACb,OAAOA,GAAG,KAAK;YACnB,IAEC,IAAI,CAAC,CAACC,GAAGC,IAAOD,EAAE,GAAG,GAAGC,EAAE,GAAG,GAAG,KAAK,GAErC,IAAI,CAAC,CAACD,GAAGC,IAAOD,EAAE,KAAK,GAAGC,EAAE,KAAK,GAAG,KAAK;QAE9C,OAAOL,OAAO,EAAE,CAACE;IACrB;AACJ;AAEO,MAAMI,wCAAqBC,mBAAAA,oBAA0C,CAAC;IACzE,gBAAgBd;IAChB,cAAc;QAACe;QAA6BC;QAAmBC;KAAe;AAClF"}
@@ -1,12 +1,12 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
3
3
  import { UpdateFileRepository as RepositoryAbstraction } from "./abstractions.js";
4
- import { FileModel } from "../../../domain/file/abstractions.js";
4
+ import { FileModelProvider } from "../../../domain/file/abstractions.js";
5
5
  import type { File } from "../../../domain/file/types.js";
6
6
  declare class UpdateFileRepositoryImpl implements RepositoryAbstraction.Interface {
7
7
  private updateEntry;
8
- private fileModel;
9
- constructor(updateEntry: UpdateEntryUseCase.Interface, fileModel: FileModel.Interface);
8
+ private fileModelProvider;
9
+ constructor(updateEntry: UpdateEntryUseCase.Interface, fileModelProvider: FileModelProvider.Interface);
10
10
  update(file: File): Promise<Result<void, RepositoryAbstraction.Error>>;
11
11
  }
12
12
  export declare const UpdateFileRepository: typeof UpdateFileRepositoryImpl & {