@webiny/api-file-manager 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7

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 (261) hide show
  1. package/FileManagerAppFeature.d.ts +5 -0
  2. package/FileManagerAppFeature.js +21 -0
  3. package/FileManagerAppFeature.js.map +1 -0
  4. package/delivery/AssetDelivery/AssetRequest.d.ts +1 -1
  5. package/delivery/AssetDelivery/AssetRequest.js.map +1 -1
  6. package/delivery/AssetDeliveryRoute.d.ts +24 -0
  7. package/delivery/AssetDeliveryRoute.js +69 -0
  8. package/delivery/AssetDeliveryRoute.js.map +1 -0
  9. package/delivery/setupAssetDelivery.d.ts +1 -1
  10. package/delivery/setupAssetDelivery.js +1 -66
  11. package/delivery/setupAssetDelivery.js.map +1 -1
  12. package/domain/file/abstractions.d.ts +13 -5
  13. package/domain/file/abstractions.js +2 -2
  14. package/domain/file/abstractions.js.map +1 -1
  15. package/domain/file/file.model.d.ts +3 -3
  16. package/domain/file/file.model.js +12 -7
  17. package/domain/file/file.model.js.map +1 -1
  18. package/domain/settings/validation.js +3 -10
  19. package/domain/settings/validation.js.map +1 -1
  20. package/exports/api/file-manager/assetDelivery.d.ts +10 -0
  21. package/exports/api/file-manager/assetDelivery.js +8 -0
  22. package/exports/api/file-manager/file.d.ts +2 -1
  23. package/exports/api/file-manager/file.js +2 -1
  24. package/features/FileManagerFeature.js +6 -0
  25. package/features/FileManagerFeature.js.map +1 -1
  26. package/features/assetDelivery/Asset/Asset.d.ts +8 -0
  27. package/features/assetDelivery/Asset/Asset.js +14 -0
  28. package/features/assetDelivery/Asset/Asset.js.map +1 -0
  29. package/features/assetDelivery/Asset/abstractions.d.ts +10 -0
  30. package/features/assetDelivery/Asset/abstractions.js +5 -0
  31. package/features/assetDelivery/Asset/abstractions.js.map +1 -0
  32. package/features/assetDelivery/Asset/index.d.ts +1 -0
  33. package/features/assetDelivery/Asset/index.js +1 -0
  34. package/features/assetDelivery/FilesAssetRequestResolver.js +2 -2
  35. package/features/assetDelivery/FilesAssetRequestResolver.js.map +1 -1
  36. package/features/assetDelivery/ObjectKey/ObjectKey.d.ts +8 -0
  37. package/features/assetDelivery/ObjectKey/ObjectKey.js +28 -0
  38. package/features/assetDelivery/ObjectKey/ObjectKey.js.map +1 -0
  39. package/features/assetDelivery/ObjectKey/abstractions.d.ts +12 -0
  40. package/features/assetDelivery/ObjectKey/abstractions.js +5 -0
  41. package/features/assetDelivery/ObjectKey/abstractions.js.map +1 -0
  42. package/features/assetDelivery/ObjectKey/index.d.ts +1 -0
  43. package/features/assetDelivery/ObjectKey/index.js +1 -0
  44. package/features/assetDelivery/StreamAssetReply/StreamAssetReply.d.ts +8 -0
  45. package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js +22 -0
  46. package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js.map +1 -0
  47. package/features/assetDelivery/StreamAssetReply/abstractions.d.ts +11 -0
  48. package/features/assetDelivery/StreamAssetReply/abstractions.js +5 -0
  49. package/features/assetDelivery/StreamAssetReply/abstractions.js.map +1 -0
  50. package/features/assetDelivery/StreamAssetReply/index.d.ts +1 -0
  51. package/features/assetDelivery/StreamAssetReply/index.js +1 -0
  52. package/features/assetDelivery/abstractions/AssetType.d.ts +17 -0
  53. package/features/assetDelivery/abstractions/AssetType.js +5 -0
  54. package/features/assetDelivery/abstractions/AssetType.js.map +1 -0
  55. package/features/assetDelivery/abstractions.d.ts +23 -12
  56. package/features/assetDelivery/abstractions.js.map +1 -1
  57. package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.d.ts +12 -0
  58. package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.js +30 -0
  59. package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.js.map +1 -0
  60. package/features/assetDelivery/assetTypes/image/ImageAssetType.d.ts +9 -0
  61. package/features/assetDelivery/assetTypes/image/ImageAssetType.js +18 -0
  62. package/features/assetDelivery/assetTypes/image/ImageAssetType.js.map +1 -0
  63. package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.d.ts +5 -0
  64. package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.js +5 -0
  65. package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.js.map +1 -0
  66. package/features/assetDelivery/assetTypes/image/SharpTransformer.d.ts +18 -0
  67. package/features/assetDelivery/assetTypes/image/SharpTransformer.js +47 -0
  68. package/features/assetDelivery/assetTypes/image/SharpTransformer.js.map +1 -0
  69. package/features/assetDelivery/assetTypes/image/WidthCollection.d.ts +8 -0
  70. package/features/assetDelivery/assetTypes/image/WidthCollection.js +22 -0
  71. package/features/assetDelivery/assetTypes/image/WidthCollection.js.map +1 -0
  72. package/features/assetDelivery/assetTypes/image/imageFormat.d.ts +26 -0
  73. package/features/assetDelivery/assetTypes/image/imageFormat.js +51 -0
  74. package/features/assetDelivery/assetTypes/image/imageFormat.js.map +1 -0
  75. package/features/assetDelivery/assetTypes/image/imageTypes.d.ts +39 -0
  76. package/features/assetDelivery/assetTypes/image/imageTypes.js +0 -0
  77. package/features/assetDelivery/assetTypes/image/index.d.ts +5 -0
  78. package/features/assetDelivery/assetTypes/image/index.js +4 -0
  79. package/features/assetDelivery/assetTypes/image/normalizeImageOptions.d.ts +6 -0
  80. package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js +56 -0
  81. package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js.map +1 -0
  82. package/features/assetDelivery/assetTypes/image/transformImage.d.ts +59 -0
  83. package/features/assetDelivery/assetTypes/image/transformImage.js +146 -0
  84. package/features/assetDelivery/assetTypes/image/transformImage.js.map +1 -0
  85. package/features/assetDelivery/assetTypes/image/utils.d.ts +26 -0
  86. package/features/assetDelivery/assetTypes/image/utils.js +47 -0
  87. package/features/assetDelivery/assetTypes/image/utils.js.map +1 -0
  88. package/features/assetDelivery/feature.js +13 -7
  89. package/features/assetDelivery/feature.js.map +1 -1
  90. package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js +2 -2
  91. package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js.map +1 -1
  92. package/features/assetDelivery/privateFiles/PrivateFilesAssetProcessor.js.map +1 -1
  93. package/features/assetDelivery/transformation/CallableContentsReader.d.ts +11 -0
  94. package/features/assetDelivery/transformation/CallableContentsReader.js +14 -0
  95. package/features/assetDelivery/transformation/CallableContentsReader.js.map +1 -0
  96. package/features/assetDelivery/transformation/TransformationAssetProcessor.d.ts +4 -6
  97. package/features/assetDelivery/transformation/TransformationAssetProcessor.js +13 -11
  98. package/features/assetDelivery/transformation/TransformationAssetProcessor.js.map +1 -1
  99. package/features/assetDelivery/transformation/index.d.ts +5 -0
  100. package/features/assetDelivery/transformation/index.js +4 -0
  101. package/features/extractMetadata/ExtractMetadataHandler.d.ts +11 -0
  102. package/features/extractMetadata/ExtractMetadataHandler.js +25 -0
  103. package/features/extractMetadata/ExtractMetadataHandler.js.map +1 -0
  104. package/features/extractMetadata/ExtractMetadataInput.d.ts +3 -0
  105. package/features/extractMetadata/ExtractMetadataInput.js +0 -0
  106. package/features/file/CreateFile/CreateFileRepository.d.ts +3 -3
  107. package/features/file/CreateFile/CreateFileRepository.js +6 -5
  108. package/features/file/CreateFile/CreateFileRepository.js.map +1 -1
  109. package/features/file/DeleteFile/DeleteFileRepository.d.ts +3 -3
  110. package/features/file/DeleteFile/DeleteFileRepository.js +6 -5
  111. package/features/file/DeleteFile/DeleteFileRepository.js.map +1 -1
  112. package/features/file/FileModelProvider.d.ts +31 -0
  113. package/features/file/FileModelProvider.js +22 -0
  114. package/features/file/FileModelProvider.js.map +1 -0
  115. package/features/file/FileUrlGenerator/FileUrlGenerator.d.ts +12 -0
  116. package/features/file/FileUrlGenerator/FileUrlGenerator.js +19 -0
  117. package/features/file/FileUrlGenerator/FileUrlGenerator.js.map +1 -0
  118. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.d.ts +13 -0
  119. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js +29 -0
  120. package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js.map +1 -0
  121. package/features/file/FileUrlGenerator/abstractions.d.ts +15 -4
  122. package/features/file/FileUrlGenerator/abstractions.js +3 -2
  123. package/features/file/FileUrlGenerator/abstractions.js.map +1 -1
  124. package/features/file/FileUrlGenerator/feature.d.ts +4 -0
  125. package/features/file/FileUrlGenerator/feature.js +13 -0
  126. package/features/file/FileUrlGenerator/feature.js.map +1 -0
  127. package/features/file/FileUrlGenerator/index.d.ts +2 -0
  128. package/features/file/FileUrlGenerator/index.js +1 -0
  129. package/features/file/GetFile/GetFileRepository.d.ts +3 -3
  130. package/features/file/GetFile/GetFileRepository.js +6 -5
  131. package/features/file/GetFile/GetFileRepository.js.map +1 -1
  132. package/features/file/GetFileByUrl/GetFileByUrlUseCase.d.ts +15 -0
  133. package/features/file/GetFileByUrl/GetFileByUrlUseCase.js +37 -0
  134. package/features/file/GetFileByUrl/GetFileByUrlUseCase.js.map +1 -0
  135. package/features/file/GetFileByUrl/abstractions.d.ts +18 -0
  136. package/features/file/GetFileByUrl/abstractions.js +5 -0
  137. package/features/file/GetFileByUrl/abstractions.js.map +1 -0
  138. package/features/file/GetFileByUrl/feature.d.ts +4 -0
  139. package/features/file/GetFileByUrl/feature.js +11 -0
  140. package/features/file/GetFileByUrl/feature.js.map +1 -0
  141. package/features/file/GetFileByUrl/index.d.ts +1 -0
  142. package/features/file/GetFileByUrl/index.js +1 -0
  143. package/features/file/ListFiles/ListFilesRepository.d.ts +3 -3
  144. package/features/file/ListFiles/ListFilesRepository.js +8 -7
  145. package/features/file/ListFiles/ListFilesRepository.js.map +1 -1
  146. package/features/file/ListImagesByTagTool/ListImagesByTagTool.d.ts +15 -5
  147. package/features/file/ListImagesByTagTool/ListImagesByTagTool.js +21 -7
  148. package/features/file/ListImagesByTagTool/ListImagesByTagTool.js.map +1 -1
  149. package/features/file/ListTags/ListTagsRepository.d.ts +3 -3
  150. package/features/file/ListTags/ListTagsRepository.js +7 -6
  151. package/features/file/ListTags/ListTagsRepository.js.map +1 -1
  152. package/features/file/UpdateFile/UpdateFileRepository.d.ts +3 -3
  153. package/features/file/UpdateFile/UpdateFileRepository.js +6 -5
  154. package/features/file/UpdateFile/UpdateFileRepository.js.map +1 -1
  155. package/features/settings/SettingsInstaller/SettingsInstaller.js +1 -4
  156. package/features/settings/SettingsInstaller/SettingsInstaller.js.map +1 -1
  157. package/features/settings/UpdateSettings/UpdateSettingsUseCase.d.ts +3 -1
  158. package/features/settings/UpdateSettings/UpdateSettingsUseCase.js +10 -2
  159. package/features/settings/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
  160. package/features/upload/CompleteMultiPartUpload/abstractions.d.ts +12 -0
  161. package/features/upload/CompleteMultiPartUpload/abstractions.js +5 -0
  162. package/features/upload/CompleteMultiPartUpload/abstractions.js.map +1 -0
  163. package/features/upload/CompleteMultiPartUpload/index.d.ts +1 -0
  164. package/features/upload/CompleteMultiPartUpload/index.js +1 -0
  165. package/features/upload/CreateMultiPartUpload/abstractions.d.ts +14 -0
  166. package/features/upload/CreateMultiPartUpload/abstractions.js +5 -0
  167. package/features/upload/CreateMultiPartUpload/abstractions.js.map +1 -0
  168. package/features/upload/CreateMultiPartUpload/index.d.ts +1 -0
  169. package/features/upload/CreateMultiPartUpload/index.js +1 -0
  170. package/features/upload/GetUploadPayload/abstractions.d.ts +10 -0
  171. package/features/upload/GetUploadPayload/abstractions.js +5 -0
  172. package/features/upload/GetUploadPayload/abstractions.js.map +1 -0
  173. package/features/upload/GetUploadPayload/index.d.ts +1 -0
  174. package/features/upload/GetUploadPayload/index.js +1 -0
  175. package/features/upload/ReadFileMetadata/MetadataReader.d.ts +11 -0
  176. package/features/upload/ReadFileMetadata/MetadataReader.js +21 -0
  177. package/features/upload/ReadFileMetadata/MetadataReader.js.map +1 -0
  178. package/features/upload/ReadFileMetadata/abstractions.d.ts +15 -0
  179. package/features/upload/ReadFileMetadata/abstractions.js +5 -0
  180. package/features/upload/ReadFileMetadata/abstractions.js.map +1 -0
  181. package/features/upload/ReadFileMetadata/feature.d.ts +4 -0
  182. package/features/upload/ReadFileMetadata/feature.js +11 -0
  183. package/features/upload/ReadFileMetadata/feature.js.map +1 -0
  184. package/features/upload/ReadFileMetadata/index.d.ts +1 -0
  185. package/features/upload/ReadFileMetadata/index.js +1 -0
  186. package/features/upload/WriteFileMetadata/MetadataWriter.d.ts +14 -0
  187. package/features/upload/WriteFileMetadata/MetadataWriter.js +36 -0
  188. package/features/upload/WriteFileMetadata/MetadataWriter.js.map +1 -0
  189. package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +11 -0
  190. package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +20 -0
  191. package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
  192. package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +11 -0
  193. package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +22 -0
  194. package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
  195. package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.d.ts +11 -0
  196. package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.js +22 -0
  197. package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.js.map +1 -0
  198. package/features/upload/WriteFileMetadata/abstractions.d.ts +9 -0
  199. package/features/upload/WriteFileMetadata/abstractions.js +5 -0
  200. package/features/upload/WriteFileMetadata/abstractions.js.map +1 -0
  201. package/features/upload/WriteFileMetadata/feature.d.ts +4 -0
  202. package/features/upload/WriteFileMetadata/feature.js +17 -0
  203. package/features/upload/WriteFileMetadata/feature.js.map +1 -0
  204. package/features/upload/index.d.ts +17 -0
  205. package/features/upload/index.js +10 -0
  206. package/features/upload/types.d.ts +28 -0
  207. package/features/upload/types.js +0 -0
  208. package/features/upload/utils/FileExtension.d.ts +6 -0
  209. package/features/upload/utils/FileExtension.js +16 -0
  210. package/features/upload/utils/FileExtension.js.map +1 -0
  211. package/features/upload/utils/FileKey.d.ts +11 -0
  212. package/features/upload/utils/FileKey.js +33 -0
  213. package/features/upload/utils/FileKey.js.map +1 -0
  214. package/features/upload/utils/FileNormalizer.d.ts +13 -0
  215. package/features/upload/utils/FileNormalizer.js +41 -0
  216. package/features/upload/utils/FileNormalizer.js.map +1 -0
  217. package/features/upload/utils/FileUploadModifier.d.ts +30 -0
  218. package/features/upload/utils/FileUploadModifier.js +39 -0
  219. package/features/upload/utils/FileUploadModifier.js.map +1 -0
  220. package/features/upload/utils/checkPermissions.d.ts +5 -0
  221. package/features/upload/utils/checkPermissions.js +22 -0
  222. package/features/upload/utils/checkPermissions.js.map +1 -0
  223. package/features/upload/utils/createFileNormalizerFromContext.d.ts +3 -0
  224. package/features/upload/utils/createFileNormalizerFromContext.js +9 -0
  225. package/features/upload/utils/createFileNormalizerFromContext.js.map +1 -0
  226. package/features/upload/utils/mimeTypes.d.ts +1 -0
  227. package/features/upload/utils/mimeTypes.js +9 -0
  228. package/features/upload/utils/mimeTypes.js.map +1 -0
  229. package/graphql/FmGraphQLSchema.d.ts +24 -0
  230. package/graphql/FmGraphQLSchema.js +459 -0
  231. package/graphql/FmGraphQLSchema.js.map +1 -0
  232. package/index.d.ts +3 -6
  233. package/index.js +3 -32
  234. package/index.js.map +1 -1
  235. package/package.json +23 -17
  236. package/types.d.ts +1 -1
  237. package/types.js +1 -1
  238. package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.d.ts +0 -9
  239. package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.js +0 -13
  240. package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.js.map +0 -1
  241. package/graphql/baseSchema.d.ts +0 -3
  242. package/graphql/baseSchema.js +0 -100
  243. package/graphql/baseSchema.js.map +0 -1
  244. package/graphql/createFilesTypeDefs.d.ts +0 -8
  245. package/graphql/createFilesTypeDefs.js +0 -191
  246. package/graphql/createFilesTypeDefs.js.map +0 -1
  247. package/graphql/filesSchema.d.ts +0 -4
  248. package/graphql/filesSchema.js +0 -96
  249. package/graphql/filesSchema.js.map +0 -1
  250. package/graphql/getFileByUrl.d.ts +0 -3
  251. package/graphql/getFileByUrl.js +0 -61
  252. package/graphql/getFileByUrl.js.map +0 -1
  253. package/graphql/index.d.ts +0 -4
  254. package/graphql/index.js +0 -47
  255. package/graphql/index.js.map +0 -1
  256. package/graphql/utils.d.ts +0 -11
  257. package/graphql/utils.js +0 -12
  258. package/graphql/utils.js.map +0 -1
  259. package/modelModifier/CmsModelModifier.d.ts +0 -26
  260. package/modelModifier/CmsModelModifier.js +0 -51
  261. package/modelModifier/CmsModelModifier.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ import { Result } from "@webiny/feature/api";
2
+ import { GetFileByUrlUseCase } from "./abstractions.js";
3
+ import { ListFilesUseCase } from "../ListFiles/abstractions.js";
4
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
5
+ import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
6
+ class GetFileByUrlUseCaseImpl {
7
+ constructor(identityContext, listFiles){
8
+ this.identityContext = identityContext;
9
+ this.listFiles = listFiles;
10
+ }
11
+ async execute(url) {
12
+ const identity = this.identityContext.getIdentity();
13
+ if (identity.isAnonymous()) return Result.fail(new FileNotAuthorizedError());
14
+ const { pathname } = new URL(url);
15
+ const query = pathname.replace("/files/", "").replace("/private/", "");
16
+ const filesResult = await this.listFiles.execute({
17
+ where: {
18
+ key: query
19
+ },
20
+ limit: 1
21
+ });
22
+ if (filesResult.isFail()) return Result.fail(filesResult.error);
23
+ const files = filesResult.value.items;
24
+ const file = files.length ? files[0] : void 0;
25
+ return Result.ok(file);
26
+ }
27
+ }
28
+ const GetFileByUrlUseCase_GetFileByUrlUseCase = GetFileByUrlUseCase.createImplementation({
29
+ implementation: GetFileByUrlUseCaseImpl,
30
+ dependencies: [
31
+ IdentityContext,
32
+ ListFilesUseCase
33
+ ]
34
+ });
35
+ export { GetFileByUrlUseCase_GetFileByUrlUseCase as GetFileByUrlUseCase };
36
+
37
+ //# sourceMappingURL=GetFileByUrlUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/file/GetFileByUrl/GetFileByUrlUseCase.js","sources":["../../../../src/features/file/GetFileByUrl/GetFileByUrlUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetFileByUrlUseCase as Abstraction } from \"./abstractions.js\";\nimport { ListFilesUseCase } from \"~/features/file/ListFiles/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport type { File } from \"~/domain/file/types.js\";\n\nclass GetFileByUrlUseCaseImpl implements Abstraction.Interface {\n public constructor(\n private readonly identityContext: IdentityContext.Interface,\n private readonly listFiles: ListFilesUseCase.Interface\n ) {}\n\n public async execute(url: string): Promise<Result<File | undefined, Abstraction.Error>> {\n const identity = this.identityContext.getIdentity();\n if (identity.isAnonymous()) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n const { pathname } = new URL(url);\n const query = pathname.replace(\"/files/\", \"\").replace(\"/private/\", \"\");\n\n const filesResult = await this.listFiles.execute({\n where: { key: query },\n limit: 1\n });\n\n if (filesResult.isFail()) {\n return Result.fail(filesResult.error);\n }\n\n const files = filesResult.value.items;\n const file = files.length ? files[0] : undefined;\n\n return Result.ok(file);\n }\n}\n\nexport const GetFileByUrlUseCase = Abstraction.createImplementation({\n implementation: GetFileByUrlUseCaseImpl,\n dependencies: [IdentityContext, ListFilesUseCase]\n});\n"],"names":["GetFileByUrlUseCaseImpl","identityContext","listFiles","url","identity","Result","FileNotAuthorizedError","pathname","URL","query","filesResult","files","file","undefined","GetFileByUrlUseCase","Abstraction","IdentityContext","ListFilesUseCase"],"mappings":";;;;;AAOA,MAAMA;IACF,YACqBC,eAA0C,EAC1CC,SAAqC,CACxD;aAFmBD,eAAe,GAAfA;aACAC,SAAS,GAATA;IAClB;IAEH,MAAa,QAAQC,GAAW,EAAwD;QACpF,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QACjD,IAAIA,SAAS,WAAW,IACpB,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAG3B,MAAM,EAAEC,QAAQ,EAAE,GAAG,IAAIC,IAAIL;QAC7B,MAAMM,QAAQF,SAAS,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,aAAa;QAEnE,MAAMG,cAAc,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YAC7C,OAAO;gBAAE,KAAKD;YAAM;YACpB,OAAO;QACX;QAEA,IAAIC,YAAY,MAAM,IAClB,OAAOL,OAAO,IAAI,CAACK,YAAY,KAAK;QAGxC,MAAMC,QAAQD,YAAY,KAAK,CAAC,KAAK;QACrC,MAAME,OAAOD,MAAM,MAAM,GAAGA,KAAK,CAAC,EAAE,GAAGE;QAEvC,OAAOR,OAAO,EAAE,CAACO;IACrB;AACJ;AAEO,MAAME,0CAAsBC,oBAAAA,oBAAgC,CAAC;IAChE,gBAAgBf;IAChB,cAAc;QAACgB;QAAiBC;KAAiB;AACrD"}
@@ -0,0 +1,18 @@
1
+ import type { Result } from "@webiny/feature/api";
2
+ import type { File } from "../../../domain/file/types.js";
3
+ import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
4
+ import type { FilePersistenceError } from "../../../domain/file/errors.js";
5
+ export interface IGetFileByUrlUseCase {
6
+ execute(url: string): Promise<Result<File | undefined, UseCaseError>>;
7
+ }
8
+ export interface IGetFileByUrlUseCaseErrors {
9
+ notAuthorized: FileNotAuthorizedError;
10
+ persistence: FilePersistenceError;
11
+ }
12
+ type UseCaseError = IGetFileByUrlUseCaseErrors[keyof IGetFileByUrlUseCaseErrors];
13
+ export declare const GetFileByUrlUseCase: import("@webiny/di").Abstraction<IGetFileByUrlUseCase>;
14
+ export declare namespace GetFileByUrlUseCase {
15
+ type Interface = IGetFileByUrlUseCase;
16
+ type Error = UseCaseError;
17
+ }
18
+ export {};
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const GetFileByUrlUseCase = createAbstraction("GetFileByUrlUseCase");
3
+ export { GetFileByUrlUseCase };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/file/GetFileByUrl/abstractions.js","sources":["../../../../src/features/file/GetFileByUrl/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { File } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport type { FilePersistenceError } from \"~/domain/file/errors.js\";\n\nexport interface IGetFileByUrlUseCase {\n execute(url: string): Promise<Result<File | undefined, UseCaseError>>;\n}\n\nexport interface IGetFileByUrlUseCaseErrors {\n notAuthorized: FileNotAuthorizedError;\n persistence: FilePersistenceError;\n}\n\ntype UseCaseError = IGetFileByUrlUseCaseErrors[keyof IGetFileByUrlUseCaseErrors];\n\n/* Retrieve a file by its public URL. */\nexport const GetFileByUrlUseCase = createAbstraction<IGetFileByUrlUseCase>(\"GetFileByUrlUseCase\");\n\nexport namespace GetFileByUrlUseCase {\n export type Interface = IGetFileByUrlUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["GetFileByUrlUseCase","createAbstraction"],"mappings":";AAkBO,MAAMA,sBAAsBC,kBAAwC"}
@@ -0,0 +1,4 @@
1
+ export declare const GetFileByUrlFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { GetFileByUrlUseCase } from "./GetFileByUrlUseCase.js";
3
+ const GetFileByUrlFeature = createFeature({
4
+ name: "FileManager/GetFileByUrl",
5
+ register (container) {
6
+ container.register(GetFileByUrlUseCase);
7
+ }
8
+ });
9
+ export { GetFileByUrlFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/file/GetFileByUrl/feature.js","sources":["../../../../src/features/file/GetFileByUrl/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetFileByUrlUseCase } from \"./GetFileByUrlUseCase.js\";\n\nexport const GetFileByUrlFeature = createFeature({\n name: \"FileManager/GetFileByUrl\",\n register(container) {\n container.register(GetFileByUrlUseCase);\n }\n});\n"],"names":["GetFileByUrlFeature","createFeature","container","GetFileByUrlUseCase"],"mappings":";;AAGO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
@@ -0,0 +1 @@
1
+ export { GetFileByUrlUseCase } from "./abstractions.js";
@@ -0,0 +1 @@
1
+ export { GetFileByUrlUseCase } from "./abstractions.js";
@@ -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 & {
@@ -1,18 +1,19 @@
1
1
  import { Result } from "@webiny/feature/api";
2
2
  import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry";
3
3
  import { UpdateFileRepository } 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 { FileToEntryMapper } from "../shared/FileToEntryMapper.js";
7
7
  class UpdateFileRepositoryImpl {
8
- constructor(updateEntry, fileModel){
8
+ constructor(updateEntry, fileModelProvider){
9
9
  this.updateEntry = updateEntry;
10
- this.fileModel = fileModel;
10
+ this.fileModelProvider = fileModelProvider;
11
11
  }
12
12
  async update(file) {
13
13
  const entry = FileToEntryMapper.toEntry(file);
14
14
  const id = `${file.id}#0001`;
15
- const result = await this.updateEntry.execute(this.fileModel, id, {
15
+ const fileModel = await this.fileModelProvider.get();
16
+ const result = await this.updateEntry.execute(fileModel, id, {
16
17
  wbyAco_location: file.location,
17
18
  values: entry.values
18
19
  });
@@ -29,7 +30,7 @@ const UpdateFileRepository_UpdateFileRepository = UpdateFileRepository.createImp
29
30
  implementation: UpdateFileRepositoryImpl,
30
31
  dependencies: [
31
32
  UpdateEntryUseCase,
32
- FileModel
33
+ FileModelProvider
33
34
  ]
34
35
  });
35
36
  export { UpdateFileRepository_UpdateFileRepository as UpdateFileRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"features/file/UpdateFile/UpdateFileRepository.js","sources":["../../../../src/features/file/UpdateFile/UpdateFileRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { UpdateFileRepository 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 { FileToEntryMapper } from \"../shared/FileToEntryMapper.js\";\n\nclass UpdateFileRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private fileModel: FileModel.Interface\n ) {}\n\n async update(file: File): Promise<Result<void, RepositoryAbstraction.Error>> {\n const entry = FileToEntryMapper.toEntry(file);\n\n // Files are not versioned, so we're always updating the same revision\n const id = `${file.id}#0001`;\n\n const result = await this.updateEntry.execute(this.fileModel, id, {\n wbyAco_location: file.location,\n values: entry.values\n });\n\n if (result.isFail()) {\n const error = result.error;\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\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n return Result.ok();\n }\n}\n\nexport const UpdateFileRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateFileRepositoryImpl,\n dependencies: [UpdateEntryUseCase, FileModel]\n});\n"],"names":["UpdateFileRepositoryImpl","updateEntry","fileModel","file","entry","FileToEntryMapper","id","result","error","Result","FileNotFoundError","FileNotAuthorizedError","FilePersistenceError","UpdateFileRepository","RepositoryAbstraction","UpdateEntryUseCase","FileModel"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,WAAyC,EACzCC,SAA8B,CACxC;aAFUD,WAAW,GAAXA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,OAAOC,IAAU,EAAsD;QACzE,MAAMC,QAAQC,kBAAkB,OAAO,CAACF;QAGxC,MAAMG,KAAK,GAAGH,KAAK,EAAE,CAAC,KAAK,CAAC;QAE5B,MAAMI,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAED,IAAI;YAC9D,iBAAiBH,KAAK,QAAQ;YAC9B,QAAQC,MAAM,MAAM;QACxB;QAEA,IAAIG,OAAO,MAAM,IAAI;YACjB,MAAMC,QAAQD,OAAO,KAAK;YAC1B,IAAIC,AAAe,yBAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,kBAAkBJ;YAG7C,IAAIE,AAAe,8BAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIE;YAG3B,OAAOF,OAAO,IAAI,CAAC,IAAIG,qBAAqBL,OAAO,KAAK;QAC5D;QAEA,OAAOE,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMI,4CAAuBC,qBAAAA,oBAA0C,CAAC;IAC3E,gBAAgBd;IAChB,cAAc;QAACe;QAAoBC;KAAU;AACjD"}
1
+ {"version":3,"file":"features/file/UpdateFile/UpdateFileRepository.js","sources":["../../../../src/features/file/UpdateFile/UpdateFileRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { UpdateFileRepository 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 { FileToEntryMapper } from \"../shared/FileToEntryMapper.js\";\n\nclass UpdateFileRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private updateEntry: UpdateEntryUseCase.Interface,\n private fileModelProvider: FileModelProvider.Interface\n ) {}\n\n async update(file: File): Promise<Result<void, RepositoryAbstraction.Error>> {\n const entry = FileToEntryMapper.toEntry(file);\n\n // Files are not versioned, so we're always updating the same revision\n const id = `${file.id}#0001`;\n\n const fileModel = await this.fileModelProvider.get();\n const result = await this.updateEntry.execute(fileModel, id, {\n wbyAco_location: file.location,\n values: entry.values\n });\n\n if (result.isFail()) {\n const error = result.error;\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\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n return Result.ok();\n }\n}\n\nexport const UpdateFileRepository = RepositoryAbstraction.createImplementation({\n implementation: UpdateFileRepositoryImpl,\n dependencies: [UpdateEntryUseCase, FileModelProvider]\n});\n"],"names":["UpdateFileRepositoryImpl","updateEntry","fileModelProvider","file","entry","FileToEntryMapper","id","fileModel","result","error","Result","FileNotFoundError","FileNotAuthorizedError","FilePersistenceError","UpdateFileRepository","RepositoryAbstraction","UpdateEntryUseCase","FileModelProvider"],"mappings":";;;;;;AAYA,MAAMA;IACF,YACYC,WAAyC,EACzCC,iBAA8C,CACxD;aAFUD,WAAW,GAAXA;aACAC,iBAAiB,GAAjBA;IACT;IAEH,MAAM,OAAOC,IAAU,EAAsD;QACzE,MAAMC,QAAQC,kBAAkB,OAAO,CAACF;QAGxC,MAAMG,KAAK,GAAGH,KAAK,EAAE,CAAC,KAAK,CAAC;QAE5B,MAAMI,YAAY,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG;QAClD,MAAMC,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAACD,WAAWD,IAAI;YACzD,iBAAiBH,KAAK,QAAQ;YAC9B,QAAQC,MAAM,MAAM;QACxB;QAEA,IAAII,OAAO,MAAM,IAAI;YACjB,MAAMC,QAAQD,OAAO,KAAK;YAC1B,IAAIC,AAAe,yBAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,kBAAkBL;YAG7C,IAAIG,AAAe,8BAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIE;YAG3B,OAAOF,OAAO,IAAI,CAAC,IAAIG,qBAAqBL,OAAO,KAAK;QAC5D;QAEA,OAAOE,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMI,4CAAuBC,qBAAAA,oBAA0C,CAAC;IAC3E,gBAAgBf;IAChB,cAAc;QAACgB;QAAoBC;KAAkB;AACzD"}
@@ -1,4 +1,3 @@
1
- import { ServiceDiscovery } from "@webiny/api";
2
1
  import { createImplementation } from "@webiny/feature/api";
3
2
  import { AppInstaller } from "@webiny/api-core/features/tenancy/InstallTenant/index.js";
4
3
  import { FILE_MANAGER_GENERAL_SETTINGS } from "../../../domain/settings/constants.js";
@@ -13,10 +12,8 @@ class SettingsInstallerImpl {
13
12
  this.dependsOn = [];
14
13
  }
15
14
  async install() {
16
- const manifest = await ServiceDiscovery.load();
17
- const { domain } = manifest?.api.cloudfront;
18
15
  await this.updateSettings.execute({
19
- srcPrefix: `${domain}/files`
16
+ srcPrefix: ""
20
17
  });
21
18
  }
22
19
  async uninstall() {
@@ -1 +1 @@
1
- {"version":3,"file":"features/settings/SettingsInstaller/SettingsInstaller.js","sources":["../../../../src/features/settings/SettingsInstaller/SettingsInstaller.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api\";\nimport { createImplementation } from \"@webiny/feature/api\";\nimport { AppInstaller } from \"@webiny/api-core/features/tenancy/InstallTenant/index.js\";\nimport { FILE_MANAGER_GENERAL_SETTINGS } from \"~/domain/settings/constants.js\";\nimport { UpdateSettingsUseCase } from \"~/features/settings/UpdateSettings/abstractions.js\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass SettingsInstallerImpl implements AppInstaller.Interface {\n readonly alwaysRun = true;\n readonly appName = \"FileManager\";\n readonly dependsOn = [];\n\n constructor(\n private updateSettings: UpdateSettingsUseCase.Interface,\n private keyValueStore: KeyValueStore.Interface\n ) {}\n\n async install(): Promise<void> {\n // TODO: move this to api-core with a proper abstraction\n const manifest = await ServiceDiscovery.load();\n const { domain } = manifest?.api.cloudfront;\n\n await this.updateSettings.execute({\n srcPrefix: `${domain}/files`\n });\n }\n\n async uninstall(): Promise<void> {\n await this.keyValueStore.delete(FILE_MANAGER_GENERAL_SETTINGS);\n }\n}\n\nexport const SettingsInstaller = createImplementation({\n abstraction: AppInstaller,\n implementation: SettingsInstallerImpl,\n dependencies: [UpdateSettingsUseCase, KeyValueStore]\n});\n"],"names":["SettingsInstallerImpl","updateSettings","keyValueStore","manifest","ServiceDiscovery","domain","FILE_MANAGER_GENERAL_SETTINGS","SettingsInstaller","createImplementation","AppInstaller","UpdateSettingsUseCase","KeyValueStore"],"mappings":";;;;;;AAOA,MAAMA;IAKF,YACYC,cAA+C,EAC/CC,aAAsC,CAChD;aAFUD,cAAc,GAAdA;aACAC,aAAa,GAAbA;aANH,SAAS,GAAG;aACZ,OAAO,GAAG;aACV,SAAS,GAAG,EAAE;IAKpB;IAEH,MAAM,UAAyB;QAE3B,MAAMC,WAAW,MAAMC,iBAAiB,IAAI;QAC5C,MAAM,EAAEC,MAAM,EAAE,GAAGF,UAAU,IAAI;QAEjC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAC9B,WAAW,GAAGE,OAAO,MAAM,CAAC;QAChC;IACJ;IAEA,MAAM,YAA2B;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAACC;IACpC;AACJ;AAEO,MAAMC,oBAAoBC,qBAAqB;IAClD,aAAaC;IACb,gBAAgBT;IAChB,cAAc;QAACU;QAAuBC;KAAc;AACxD"}
1
+ {"version":3,"file":"features/settings/SettingsInstaller/SettingsInstaller.js","sources":["../../../../src/features/settings/SettingsInstaller/SettingsInstaller.ts"],"sourcesContent":["import { createImplementation } from \"@webiny/feature/api\";\nimport { AppInstaller } from \"@webiny/api-core/features/tenancy/InstallTenant/index.js\";\nimport { FILE_MANAGER_GENERAL_SETTINGS } from \"~/domain/settings/constants.js\";\nimport { UpdateSettingsUseCase } from \"~/features/settings/UpdateSettings/abstractions.js\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass SettingsInstallerImpl implements AppInstaller.Interface {\n readonly alwaysRun = true;\n readonly appName = \"FileManager\";\n readonly dependsOn = [];\n\n constructor(\n private updateSettings: UpdateSettingsUseCase.Interface,\n private keyValueStore: KeyValueStore.Interface\n ) {}\n\n async install(): Promise<void> {\n // An empty srcPrefix makes UpdateSettingsUseCase fill in the default from the API's\n // public URL, so every install picks up the current one.\n await this.updateSettings.execute({ srcPrefix: \"\" });\n }\n\n async uninstall(): Promise<void> {\n await this.keyValueStore.delete(FILE_MANAGER_GENERAL_SETTINGS);\n }\n}\n\nexport const SettingsInstaller = createImplementation({\n abstraction: AppInstaller,\n implementation: SettingsInstallerImpl,\n dependencies: [UpdateSettingsUseCase, KeyValueStore]\n});\n"],"names":["SettingsInstallerImpl","updateSettings","keyValueStore","FILE_MANAGER_GENERAL_SETTINGS","SettingsInstaller","createImplementation","AppInstaller","UpdateSettingsUseCase","KeyValueStore"],"mappings":";;;;;AAMA,MAAMA;IAKF,YACYC,cAA+C,EAC/CC,aAAsC,CAChD;aAFUD,cAAc,GAAdA;aACAC,aAAa,GAAbA;aANH,SAAS,GAAG;aACZ,OAAO,GAAG;aACV,SAAS,GAAG,EAAE;IAKpB;IAEH,MAAM,UAAyB;QAG3B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;YAAE,WAAW;QAAG;IACtD;IAEA,MAAM,YAA2B;QAC7B,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAACC;IACpC;AACJ;AAEO,MAAMC,oBAAoBC,qBAAqB;IAClD,aAAaC;IACb,gBAAgBN;IAChB,cAAc;QAACO;QAAuBC;KAAc;AACxD"}
@@ -5,11 +5,13 @@ import { GetSettingsUseCase } from "../GetSettings/abstractions.js";
5
5
  import type { FileManagerSettings } from "../../../domain/settings/types.js";
6
6
  import type { UpdateSettingsInput } from "../../../domain/settings/types.js";
7
7
  import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
8
+ import { PublicUrls } from "@webiny/api-core/features/publicUrls/index.js";
8
9
  declare class UpdateSettingsUseCaseImpl implements UseCaseAbstraction.Interface {
9
10
  private keyValueStore;
10
11
  private getSettings;
11
12
  private eventPublisher;
12
- constructor(keyValueStore: KeyValueStore.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface);
13
+ private publicUrls;
14
+ constructor(keyValueStore: KeyValueStore.Interface, getSettings: GetSettingsUseCase.Interface, eventPublisher: EventPublisher.Interface, publicUrls: PublicUrls.Interface);
13
15
  execute(input: UpdateSettingsInput): Promise<Result<FileManagerSettings, UseCaseAbstraction.Error>>;
14
16
  }
15
17
  export declare const UpdateSettingsUseCase: typeof UpdateSettingsUseCaseImpl & {
@@ -5,14 +5,16 @@ import { GetSettingsUseCase } from "../GetSettings/abstractions.js";
5
5
  import { SettingsUpdateError, SettingsValidationError } from "../../../domain/settings/errors.js";
6
6
  import { FILE_MANAGER_GENERAL_SETTINGS } from "../../../domain/settings/constants.js";
7
7
  import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
8
+ import { PublicUrls } from "@webiny/api-core/features/publicUrls/index.js";
8
9
  import { SettingsAfterUpdateEvent, SettingsBeforeUpdateEvent } from "./events.js";
9
10
  import { updateSettingsValidation } from "../../../domain/settings/validation.js";
10
11
  import { createZodError } from "@webiny/utils";
11
12
  class UpdateSettingsUseCaseImpl {
12
- constructor(keyValueStore, getSettings, eventPublisher){
13
+ constructor(keyValueStore, getSettings, eventPublisher, publicUrls){
13
14
  this.keyValueStore = keyValueStore;
14
15
  this.getSettings = getSettings;
15
16
  this.eventPublisher = eventPublisher;
17
+ this.publicUrls = publicUrls;
16
18
  }
17
19
  async execute(input) {
18
20
  const validationResult = await updateSettingsValidation.safeParseAsync(input);
@@ -21,7 +23,12 @@ class UpdateSettingsUseCaseImpl {
21
23
  return Result.fail(new SettingsValidationError(zodError.data.invalidFields));
22
24
  }
23
25
  const validatedInput = validationResult.data;
26
+ if (!validatedInput.srcPrefix) {
27
+ const apiUrl = await this.publicUrls.getApiUrl();
28
+ validatedInput.srcPrefix = apiUrl.join("/files/");
29
+ }
24
30
  const existingResult = await this.getSettings.execute();
31
+ if (existingResult.isFail()) return Result.fail(existingResult.error);
25
32
  const existing = existingResult.value;
26
33
  const updatedSettings = {
27
34
  ...existing,
@@ -47,7 +54,8 @@ const UpdateSettingsUseCase_UpdateSettingsUseCase = UpdateSettingsUseCase.create
47
54
  dependencies: [
48
55
  KeyValueStore,
49
56
  GetSettingsUseCase,
50
- EventPublisher
57
+ EventPublisher,
58
+ PublicUrls
51
59
  ]
52
60
  });
53
61
  export { UpdateSettingsUseCase_UpdateSettingsUseCase as UpdateSettingsUseCase };
@@ -1 +1 @@
1
- {"version":3,"file":"features/settings/UpdateSettings/UpdateSettingsUseCase.js","sources":["../../../../src/features/settings/UpdateSettings/UpdateSettingsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { UpdateSettingsUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../GetSettings/abstractions.js\";\nimport type { FileManagerSettings } from \"~/domain/settings/types.js\";\nimport type { UpdateSettingsInput } from \"~/domain/settings/types.js\";\nimport { SettingsUpdateError } from \"~/domain/settings/errors.js\";\nimport { SettingsValidationError } from \"~/domain/settings/errors.js\";\nimport { FILE_MANAGER_GENERAL_SETTINGS } from \"~/domain/settings/constants.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { SettingsBeforeUpdateEvent, SettingsAfterUpdateEvent } from \"./events.js\";\nimport { updateSettingsValidation } from \"~/domain/settings/validation.js\";\nimport { createZodError } from \"@webiny/utils\";\n\nclass UpdateSettingsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private keyValueStore: KeyValueStore.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(\n input: UpdateSettingsInput\n ): Promise<Result<FileManagerSettings, UseCaseAbstraction.Error>> {\n // Validate input\n const validationResult = await updateSettingsValidation.safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new SettingsValidationError(zodError.data!.invalidFields));\n }\n\n const validatedInput = validationResult.data;\n\n // Get existing settings to merge with new data\n const existingResult = await this.getSettings.execute();\n const existing = existingResult.value;\n\n // Prepare merged settings\n const updatedSettings: FileManagerSettings = {\n ...existing,\n ...validatedInput\n };\n\n // Publish BeforeUpdate event\n await this.eventPublisher.publish(\n new SettingsBeforeUpdateEvent({\n original: existing,\n settings: updatedSettings,\n input: validatedInput\n })\n );\n\n const result = await this.keyValueStore.set(FILE_MANAGER_GENERAL_SETTINGS, updatedSettings);\n\n if (result.isFail()) {\n return Result.fail(new SettingsUpdateError(result.error));\n }\n\n // Publish AfterUpdate event\n await this.eventPublisher.publish(\n new SettingsAfterUpdateEvent({\n original: existing,\n settings: updatedSettings,\n input: validatedInput\n })\n );\n\n return Result.ok(updatedSettings);\n }\n}\n\nexport const UpdateSettingsUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateSettingsUseCaseImpl,\n dependencies: [KeyValueStore, GetSettingsUseCase, EventPublisher]\n});\n"],"names":["UpdateSettingsUseCaseImpl","keyValueStore","getSettings","eventPublisher","input","validationResult","updateSettingsValidation","zodError","createZodError","Result","SettingsValidationError","validatedInput","existingResult","existing","updatedSettings","SettingsBeforeUpdateEvent","result","FILE_MANAGER_GENERAL_SETTINGS","SettingsUpdateError","SettingsAfterUpdateEvent","UpdateSettingsUseCase","UseCaseAbstraction","KeyValueStore","GetSettingsUseCase","EventPublisher"],"mappings":";;;;;;;;;;AAcA,MAAMA;IACF,YACYC,aAAsC,EACtCC,WAAyC,EACzCC,cAAwC,CAClD;aAHUF,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QACFC,KAA0B,EACoC;QAE9D,MAAMC,mBAAmB,MAAMC,yBAAyB,cAAc,CAACF;QACvE,IAAI,CAACC,iBAAiB,OAAO,EAAE;YAC3B,MAAME,WAAWC,eAAeH,iBAAiB,KAAK;YACtD,OAAOI,OAAO,IAAI,CAAC,IAAIC,wBAAwBH,SAAS,IAAI,CAAE,aAAa;QAC/E;QAEA,MAAMI,iBAAiBN,iBAAiB,IAAI;QAG5C,MAAMO,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QACrD,MAAMC,WAAWD,eAAe,KAAK;QAGrC,MAAME,kBAAuC;YACzC,GAAGD,QAAQ;YACX,GAAGF,cAAc;QACrB;QAGA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAII,0BAA0B;YAC1B,UAAUF;YACV,UAAUC;YACV,OAAOH;QACX;QAGJ,MAAMK,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAACC,+BAA+BH;QAE3E,IAAIE,OAAO,MAAM,IACb,OAAOP,OAAO,IAAI,CAAC,IAAIS,oBAAoBF,OAAO,KAAK;QAI3D,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;YACzB,UAAUN;YACV,UAAUC;YACV,OAAOH;QACX;QAGJ,OAAOF,OAAO,EAAE,CAACK;IACrB;AACJ;AAEO,MAAMM,8CAAwBC,sBAAAA,oBAAuC,CAAC;IACzE,gBAAgBrB;IAChB,cAAc;QAACsB;QAAeC;QAAoBC;KAAe;AACrE"}
1
+ {"version":3,"file":"features/settings/UpdateSettings/UpdateSettingsUseCase.js","sources":["../../../../src/features/settings/UpdateSettings/UpdateSettingsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { KeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { UpdateSettingsUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../GetSettings/abstractions.js\";\nimport type { FileManagerSettings } from \"~/domain/settings/types.js\";\nimport type { UpdateSettingsInput } from \"~/domain/settings/types.js\";\nimport { SettingsUpdateError } from \"~/domain/settings/errors.js\";\nimport { SettingsValidationError } from \"~/domain/settings/errors.js\";\nimport { FILE_MANAGER_GENERAL_SETTINGS } from \"~/domain/settings/constants.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { PublicUrls } from \"@webiny/api-core/features/publicUrls/index.js\";\nimport { SettingsBeforeUpdateEvent, SettingsAfterUpdateEvent } from \"./events.js\";\nimport { updateSettingsValidation } from \"~/domain/settings/validation.js\";\nimport { createZodError } from \"@webiny/utils\";\n\nclass UpdateSettingsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private keyValueStore: KeyValueStore.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface,\n private publicUrls: PublicUrls.Interface\n ) {}\n\n async execute(\n input: UpdateSettingsInput\n ): Promise<Result<FileManagerSettings, UseCaseAbstraction.Error>> {\n // Validate input\n const validationResult = await updateSettingsValidation.safeParseAsync(input);\n if (!validationResult.success) {\n const zodError = createZodError(validationResult.error);\n return Result.fail(new SettingsValidationError(zodError.data!.invalidFields));\n }\n\n const validatedInput = validationResult.data;\n\n if (!validatedInput.srcPrefix) {\n const apiUrl = await this.publicUrls.getApiUrl();\n validatedInput.srcPrefix = apiUrl.join(\"/files/\");\n }\n\n // Get existing settings to merge with new data\n const existingResult = await this.getSettings.execute();\n if (existingResult.isFail()) {\n return Result.fail(existingResult.error);\n }\n const existing = existingResult.value;\n\n // Prepare merged settings\n const updatedSettings: FileManagerSettings = {\n ...existing,\n ...validatedInput\n };\n\n // Publish BeforeUpdate event\n await this.eventPublisher.publish(\n new SettingsBeforeUpdateEvent({\n original: existing,\n settings: updatedSettings,\n input: validatedInput\n })\n );\n\n const result = await this.keyValueStore.set(FILE_MANAGER_GENERAL_SETTINGS, updatedSettings);\n\n if (result.isFail()) {\n return Result.fail(new SettingsUpdateError(result.error));\n }\n\n // Publish AfterUpdate event\n await this.eventPublisher.publish(\n new SettingsAfterUpdateEvent({\n original: existing,\n settings: updatedSettings,\n input: validatedInput\n })\n );\n\n return Result.ok(updatedSettings);\n }\n}\n\nexport const UpdateSettingsUseCase = UseCaseAbstraction.createImplementation({\n implementation: UpdateSettingsUseCaseImpl,\n dependencies: [KeyValueStore, GetSettingsUseCase, EventPublisher, PublicUrls]\n});\n"],"names":["UpdateSettingsUseCaseImpl","keyValueStore","getSettings","eventPublisher","publicUrls","input","validationResult","updateSettingsValidation","zodError","createZodError","Result","SettingsValidationError","validatedInput","apiUrl","existingResult","existing","updatedSettings","SettingsBeforeUpdateEvent","result","FILE_MANAGER_GENERAL_SETTINGS","SettingsUpdateError","SettingsAfterUpdateEvent","UpdateSettingsUseCase","UseCaseAbstraction","KeyValueStore","GetSettingsUseCase","EventPublisher","PublicUrls"],"mappings":";;;;;;;;;;;AAeA,MAAMA;IACF,YACYC,aAAsC,EACtCC,WAAyC,EACzCC,cAAwC,EACxCC,UAAgC,CAC1C;aAJUH,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;aACAC,UAAU,GAAVA;IACT;IAEH,MAAM,QACFC,KAA0B,EACoC;QAE9D,MAAMC,mBAAmB,MAAMC,yBAAyB,cAAc,CAACF;QACvE,IAAI,CAACC,iBAAiB,OAAO,EAAE;YAC3B,MAAME,WAAWC,eAAeH,iBAAiB,KAAK;YACtD,OAAOI,OAAO,IAAI,CAAC,IAAIC,wBAAwBH,SAAS,IAAI,CAAE,aAAa;QAC/E;QAEA,MAAMI,iBAAiBN,iBAAiB,IAAI;QAE5C,IAAI,CAACM,eAAe,SAAS,EAAE;YAC3B,MAAMC,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS;YAC9CD,eAAe,SAAS,GAAGC,OAAO,IAAI,CAAC;QAC3C;QAGA,MAAMC,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QACrD,IAAIA,eAAe,MAAM,IACrB,OAAOJ,OAAO,IAAI,CAACI,eAAe,KAAK;QAE3C,MAAMC,WAAWD,eAAe,KAAK;QAGrC,MAAME,kBAAuC;YACzC,GAAGD,QAAQ;YACX,GAAGH,cAAc;QACrB;QAGA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIK,0BAA0B;YAC1B,UAAUF;YACV,UAAUC;YACV,OAAOJ;QACX;QAGJ,MAAMM,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAACC,+BAA+BH;QAE3E,IAAIE,OAAO,MAAM,IACb,OAAOR,OAAO,IAAI,CAAC,IAAIU,oBAAoBF,OAAO,KAAK;QAI3D,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIG,yBAAyB;YACzB,UAAUN;YACV,UAAUC;YACV,OAAOJ;QACX;QAGJ,OAAOF,OAAO,EAAE,CAACM;IACrB;AACJ;AAEO,MAAMM,8CAAwBC,sBAAAA,oBAAuC,CAAC;IACzE,gBAAgBvB;IAChB,cAAc;QAACwB;QAAeC;QAAoBC;QAAgBC;KAAW;AACjF"}
@@ -0,0 +1,12 @@
1
+ export interface ICompleteMultiPartUploadParams {
2
+ fileKey: string;
3
+ uploadId: string;
4
+ }
5
+ export interface ICompleteMultiPartUploadUseCase {
6
+ execute(params: ICompleteMultiPartUploadParams): Promise<void>;
7
+ }
8
+ export declare const CompleteMultiPartUploadUseCase: import("@webiny/di").Abstraction<ICompleteMultiPartUploadUseCase>;
9
+ export declare namespace CompleteMultiPartUploadUseCase {
10
+ type Interface = ICompleteMultiPartUploadUseCase;
11
+ type Params = ICompleteMultiPartUploadParams;
12
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const CompleteMultiPartUploadUseCase = createAbstraction("CompleteMultiPartUploadUseCase");
3
+ export { CompleteMultiPartUploadUseCase };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/upload/CompleteMultiPartUpload/abstractions.js","sources":["../../../../src/features/upload/CompleteMultiPartUpload/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\nexport interface ICompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\nexport interface ICompleteMultiPartUploadUseCase {\n execute(params: ICompleteMultiPartUploadParams): Promise<void>;\n}\n\nexport const CompleteMultiPartUploadUseCase = createAbstraction<ICompleteMultiPartUploadUseCase>(\n \"CompleteMultiPartUploadUseCase\"\n);\n\nexport namespace CompleteMultiPartUploadUseCase {\n export type Interface = ICompleteMultiPartUploadUseCase;\n export type Params = ICompleteMultiPartUploadParams;\n}\n"],"names":["CompleteMultiPartUploadUseCase","createAbstraction"],"mappings":";AAWO,MAAMA,iCAAiCC,kBAC1C"}
@@ -0,0 +1 @@
1
+ export { CompleteMultiPartUploadUseCase } from "./abstractions.js";