@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.
- package/FileManagerAppFeature.d.ts +5 -0
- package/FileManagerAppFeature.js +21 -0
- package/FileManagerAppFeature.js.map +1 -0
- package/delivery/AssetDelivery/AssetRequest.d.ts +1 -1
- package/delivery/AssetDelivery/AssetRequest.js.map +1 -1
- package/delivery/AssetDeliveryRoute.d.ts +24 -0
- package/delivery/AssetDeliveryRoute.js +69 -0
- package/delivery/AssetDeliveryRoute.js.map +1 -0
- package/delivery/setupAssetDelivery.d.ts +1 -1
- package/delivery/setupAssetDelivery.js +1 -66
- package/delivery/setupAssetDelivery.js.map +1 -1
- package/domain/file/abstractions.d.ts +13 -5
- package/domain/file/abstractions.js +2 -2
- package/domain/file/abstractions.js.map +1 -1
- package/domain/file/file.model.d.ts +3 -3
- package/domain/file/file.model.js +12 -7
- package/domain/file/file.model.js.map +1 -1
- package/domain/settings/validation.js +3 -10
- package/domain/settings/validation.js.map +1 -1
- package/exports/api/file-manager/assetDelivery.d.ts +10 -0
- package/exports/api/file-manager/assetDelivery.js +8 -0
- package/exports/api/file-manager/file.d.ts +2 -1
- package/exports/api/file-manager/file.js +2 -1
- package/features/FileManagerFeature.js +6 -0
- package/features/FileManagerFeature.js.map +1 -1
- package/features/assetDelivery/Asset/Asset.d.ts +8 -0
- package/features/assetDelivery/Asset/Asset.js +14 -0
- package/features/assetDelivery/Asset/Asset.js.map +1 -0
- package/features/assetDelivery/Asset/abstractions.d.ts +10 -0
- package/features/assetDelivery/Asset/abstractions.js +5 -0
- package/features/assetDelivery/Asset/abstractions.js.map +1 -0
- package/features/assetDelivery/Asset/index.d.ts +1 -0
- package/features/assetDelivery/Asset/index.js +1 -0
- package/features/assetDelivery/FilesAssetRequestResolver.js +2 -2
- package/features/assetDelivery/FilesAssetRequestResolver.js.map +1 -1
- package/features/assetDelivery/ObjectKey/ObjectKey.d.ts +8 -0
- package/features/assetDelivery/ObjectKey/ObjectKey.js +28 -0
- package/features/assetDelivery/ObjectKey/ObjectKey.js.map +1 -0
- package/features/assetDelivery/ObjectKey/abstractions.d.ts +12 -0
- package/features/assetDelivery/ObjectKey/abstractions.js +5 -0
- package/features/assetDelivery/ObjectKey/abstractions.js.map +1 -0
- package/features/assetDelivery/ObjectKey/index.d.ts +1 -0
- package/features/assetDelivery/ObjectKey/index.js +1 -0
- package/features/assetDelivery/StreamAssetReply/StreamAssetReply.d.ts +8 -0
- package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js +22 -0
- package/features/assetDelivery/StreamAssetReply/StreamAssetReply.js.map +1 -0
- package/features/assetDelivery/StreamAssetReply/abstractions.d.ts +11 -0
- package/features/assetDelivery/StreamAssetReply/abstractions.js +5 -0
- package/features/assetDelivery/StreamAssetReply/abstractions.js.map +1 -0
- package/features/assetDelivery/StreamAssetReply/index.d.ts +1 -0
- package/features/assetDelivery/StreamAssetReply/index.js +1 -0
- package/features/assetDelivery/abstractions/AssetType.d.ts +17 -0
- package/features/assetDelivery/abstractions/AssetType.js +5 -0
- package/features/assetDelivery/abstractions/AssetType.js.map +1 -0
- package/features/assetDelivery/abstractions.d.ts +23 -12
- package/features/assetDelivery/abstractions.js.map +1 -1
- package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.d.ts +12 -0
- package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.js +30 -0
- package/features/assetDelivery/assetTypes/image/AssetKeyGenerator.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetType.d.ts +9 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetType.js +18 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetType.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.d.ts +5 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.js +5 -0
- package/features/assetDelivery/assetTypes/image/ImageAssetTypeHandler.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/SharpTransformer.d.ts +18 -0
- package/features/assetDelivery/assetTypes/image/SharpTransformer.js +47 -0
- package/features/assetDelivery/assetTypes/image/SharpTransformer.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/WidthCollection.d.ts +8 -0
- package/features/assetDelivery/assetTypes/image/WidthCollection.js +22 -0
- package/features/assetDelivery/assetTypes/image/WidthCollection.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/imageFormat.d.ts +26 -0
- package/features/assetDelivery/assetTypes/image/imageFormat.js +51 -0
- package/features/assetDelivery/assetTypes/image/imageFormat.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/imageTypes.d.ts +39 -0
- package/features/assetDelivery/assetTypes/image/imageTypes.js +0 -0
- package/features/assetDelivery/assetTypes/image/index.d.ts +5 -0
- package/features/assetDelivery/assetTypes/image/index.js +4 -0
- package/features/assetDelivery/assetTypes/image/normalizeImageOptions.d.ts +6 -0
- package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js +56 -0
- package/features/assetDelivery/assetTypes/image/normalizeImageOptions.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/transformImage.d.ts +59 -0
- package/features/assetDelivery/assetTypes/image/transformImage.js +146 -0
- package/features/assetDelivery/assetTypes/image/transformImage.js.map +1 -0
- package/features/assetDelivery/assetTypes/image/utils.d.ts +26 -0
- package/features/assetDelivery/assetTypes/image/utils.js +47 -0
- package/features/assetDelivery/assetTypes/image/utils.js.map +1 -0
- package/features/assetDelivery/feature.js +13 -7
- package/features/assetDelivery/feature.js.map +1 -1
- package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js +2 -2
- package/features/assetDelivery/privateFiles/PrivateFileAssetRequestResolver.js.map +1 -1
- package/features/assetDelivery/privateFiles/PrivateFilesAssetProcessor.js.map +1 -1
- package/features/assetDelivery/transformation/CallableContentsReader.d.ts +11 -0
- package/features/assetDelivery/transformation/CallableContentsReader.js +14 -0
- package/features/assetDelivery/transformation/CallableContentsReader.js.map +1 -0
- package/features/assetDelivery/transformation/TransformationAssetProcessor.d.ts +4 -6
- package/features/assetDelivery/transformation/TransformationAssetProcessor.js +13 -11
- package/features/assetDelivery/transformation/TransformationAssetProcessor.js.map +1 -1
- package/features/assetDelivery/transformation/index.d.ts +5 -0
- package/features/assetDelivery/transformation/index.js +4 -0
- package/features/extractMetadata/ExtractMetadataHandler.d.ts +11 -0
- package/features/extractMetadata/ExtractMetadataHandler.js +25 -0
- package/features/extractMetadata/ExtractMetadataHandler.js.map +1 -0
- package/features/extractMetadata/ExtractMetadataInput.d.ts +3 -0
- package/features/extractMetadata/ExtractMetadataInput.js +0 -0
- package/features/file/CreateFile/CreateFileRepository.d.ts +3 -3
- package/features/file/CreateFile/CreateFileRepository.js +6 -5
- package/features/file/CreateFile/CreateFileRepository.js.map +1 -1
- package/features/file/DeleteFile/DeleteFileRepository.d.ts +3 -3
- package/features/file/DeleteFile/DeleteFileRepository.js +6 -5
- package/features/file/DeleteFile/DeleteFileRepository.js.map +1 -1
- package/features/file/FileModelProvider.d.ts +31 -0
- package/features/file/FileModelProvider.js +22 -0
- package/features/file/FileModelProvider.js.map +1 -0
- package/features/file/FileUrlGenerator/FileUrlGenerator.d.ts +12 -0
- package/features/file/FileUrlGenerator/FileUrlGenerator.js +19 -0
- package/features/file/FileUrlGenerator/FileUrlGenerator.js.map +1 -0
- package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.d.ts +13 -0
- package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js +29 -0
- package/features/file/FileUrlGenerator/SettingsFileUrlPrefixProvider.js.map +1 -0
- package/features/file/FileUrlGenerator/abstractions.d.ts +15 -4
- package/features/file/FileUrlGenerator/abstractions.js +3 -2
- package/features/file/FileUrlGenerator/abstractions.js.map +1 -1
- package/features/file/FileUrlGenerator/feature.d.ts +4 -0
- package/features/file/FileUrlGenerator/feature.js +13 -0
- package/features/file/FileUrlGenerator/feature.js.map +1 -0
- package/features/file/FileUrlGenerator/index.d.ts +2 -0
- package/features/file/FileUrlGenerator/index.js +1 -0
- package/features/file/GetFile/GetFileRepository.d.ts +3 -3
- package/features/file/GetFile/GetFileRepository.js +6 -5
- package/features/file/GetFile/GetFileRepository.js.map +1 -1
- package/features/file/GetFileByUrl/GetFileByUrlUseCase.d.ts +15 -0
- package/features/file/GetFileByUrl/GetFileByUrlUseCase.js +37 -0
- package/features/file/GetFileByUrl/GetFileByUrlUseCase.js.map +1 -0
- package/features/file/GetFileByUrl/abstractions.d.ts +18 -0
- package/features/file/GetFileByUrl/abstractions.js +5 -0
- package/features/file/GetFileByUrl/abstractions.js.map +1 -0
- package/features/file/GetFileByUrl/feature.d.ts +4 -0
- package/features/file/GetFileByUrl/feature.js +11 -0
- package/features/file/GetFileByUrl/feature.js.map +1 -0
- package/features/file/GetFileByUrl/index.d.ts +1 -0
- package/features/file/GetFileByUrl/index.js +1 -0
- package/features/file/ListFiles/ListFilesRepository.d.ts +3 -3
- package/features/file/ListFiles/ListFilesRepository.js +8 -7
- package/features/file/ListFiles/ListFilesRepository.js.map +1 -1
- package/features/file/ListImagesByTagTool/ListImagesByTagTool.d.ts +15 -5
- package/features/file/ListImagesByTagTool/ListImagesByTagTool.js +21 -7
- package/features/file/ListImagesByTagTool/ListImagesByTagTool.js.map +1 -1
- package/features/file/ListTags/ListTagsRepository.d.ts +3 -3
- package/features/file/ListTags/ListTagsRepository.js +7 -6
- package/features/file/ListTags/ListTagsRepository.js.map +1 -1
- package/features/file/UpdateFile/UpdateFileRepository.d.ts +3 -3
- package/features/file/UpdateFile/UpdateFileRepository.js +6 -5
- package/features/file/UpdateFile/UpdateFileRepository.js.map +1 -1
- package/features/settings/SettingsInstaller/SettingsInstaller.js +1 -4
- package/features/settings/SettingsInstaller/SettingsInstaller.js.map +1 -1
- package/features/settings/UpdateSettings/UpdateSettingsUseCase.d.ts +3 -1
- package/features/settings/UpdateSettings/UpdateSettingsUseCase.js +10 -2
- package/features/settings/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
- package/features/upload/CompleteMultiPartUpload/abstractions.d.ts +12 -0
- package/features/upload/CompleteMultiPartUpload/abstractions.js +5 -0
- package/features/upload/CompleteMultiPartUpload/abstractions.js.map +1 -0
- package/features/upload/CompleteMultiPartUpload/index.d.ts +1 -0
- package/features/upload/CompleteMultiPartUpload/index.js +1 -0
- package/features/upload/CreateMultiPartUpload/abstractions.d.ts +14 -0
- package/features/upload/CreateMultiPartUpload/abstractions.js +5 -0
- package/features/upload/CreateMultiPartUpload/abstractions.js.map +1 -0
- package/features/upload/CreateMultiPartUpload/index.d.ts +1 -0
- package/features/upload/CreateMultiPartUpload/index.js +1 -0
- package/features/upload/GetUploadPayload/abstractions.d.ts +10 -0
- package/features/upload/GetUploadPayload/abstractions.js +5 -0
- package/features/upload/GetUploadPayload/abstractions.js.map +1 -0
- package/features/upload/GetUploadPayload/index.d.ts +1 -0
- package/features/upload/GetUploadPayload/index.js +1 -0
- package/features/upload/ReadFileMetadata/MetadataReader.d.ts +11 -0
- package/features/upload/ReadFileMetadata/MetadataReader.js +21 -0
- package/features/upload/ReadFileMetadata/MetadataReader.js.map +1 -0
- package/features/upload/ReadFileMetadata/abstractions.d.ts +15 -0
- package/features/upload/ReadFileMetadata/abstractions.js +5 -0
- package/features/upload/ReadFileMetadata/abstractions.js.map +1 -0
- package/features/upload/ReadFileMetadata/feature.d.ts +4 -0
- package/features/upload/ReadFileMetadata/feature.js +11 -0
- package/features/upload/ReadFileMetadata/feature.js.map +1 -0
- package/features/upload/ReadFileMetadata/index.d.ts +1 -0
- package/features/upload/ReadFileMetadata/index.js +1 -0
- package/features/upload/WriteFileMetadata/MetadataWriter.d.ts +14 -0
- package/features/upload/WriteFileMetadata/MetadataWriter.js +36 -0
- package/features/upload/WriteFileMetadata/MetadataWriter.js.map +1 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +11 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +20 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +11 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +22 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.d.ts +11 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.js +22 -0
- package/features/upload/WriteFileMetadata/WriteMetadataAfterUpdateHandler.js.map +1 -0
- package/features/upload/WriteFileMetadata/abstractions.d.ts +9 -0
- package/features/upload/WriteFileMetadata/abstractions.js +5 -0
- package/features/upload/WriteFileMetadata/abstractions.js.map +1 -0
- package/features/upload/WriteFileMetadata/feature.d.ts +4 -0
- package/features/upload/WriteFileMetadata/feature.js +17 -0
- package/features/upload/WriteFileMetadata/feature.js.map +1 -0
- package/features/upload/index.d.ts +17 -0
- package/features/upload/index.js +10 -0
- package/features/upload/types.d.ts +28 -0
- package/features/upload/types.js +0 -0
- package/features/upload/utils/FileExtension.d.ts +6 -0
- package/features/upload/utils/FileExtension.js +16 -0
- package/features/upload/utils/FileExtension.js.map +1 -0
- package/features/upload/utils/FileKey.d.ts +11 -0
- package/features/upload/utils/FileKey.js +33 -0
- package/features/upload/utils/FileKey.js.map +1 -0
- package/features/upload/utils/FileNormalizer.d.ts +13 -0
- package/features/upload/utils/FileNormalizer.js +41 -0
- package/features/upload/utils/FileNormalizer.js.map +1 -0
- package/features/upload/utils/FileUploadModifier.d.ts +30 -0
- package/features/upload/utils/FileUploadModifier.js +39 -0
- package/features/upload/utils/FileUploadModifier.js.map +1 -0
- package/features/upload/utils/checkPermissions.d.ts +5 -0
- package/features/upload/utils/checkPermissions.js +22 -0
- package/features/upload/utils/checkPermissions.js.map +1 -0
- package/features/upload/utils/createFileNormalizerFromContext.d.ts +3 -0
- package/features/upload/utils/createFileNormalizerFromContext.js +9 -0
- package/features/upload/utils/createFileNormalizerFromContext.js.map +1 -0
- package/features/upload/utils/mimeTypes.d.ts +1 -0
- package/features/upload/utils/mimeTypes.js +9 -0
- package/features/upload/utils/mimeTypes.js.map +1 -0
- package/graphql/FmGraphQLSchema.d.ts +24 -0
- package/graphql/FmGraphQLSchema.js +459 -0
- package/graphql/FmGraphQLSchema.js.map +1 -0
- package/index.d.ts +3 -6
- package/index.js +3 -32
- package/index.js.map +1 -1
- package/package.json +23 -17
- package/types.d.ts +1 -1
- package/types.js +1 -1
- package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.d.ts +0 -9
- package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.js +0 -13
- package/features/assetDelivery/transformation/PassthroughAssetTransformationStrategy.js.map +0 -1
- package/graphql/baseSchema.d.ts +0 -3
- package/graphql/baseSchema.js +0 -100
- package/graphql/baseSchema.js.map +0 -1
- package/graphql/createFilesTypeDefs.d.ts +0 -8
- package/graphql/createFilesTypeDefs.js +0 -191
- package/graphql/createFilesTypeDefs.js.map +0 -1
- package/graphql/filesSchema.d.ts +0 -4
- package/graphql/filesSchema.js +0 -96
- package/graphql/filesSchema.js.map +0 -1
- package/graphql/getFileByUrl.d.ts +0 -3
- package/graphql/getFileByUrl.js +0 -61
- package/graphql/getFileByUrl.js.map +0 -1
- package/graphql/index.d.ts +0 -4
- package/graphql/index.js +0 -47
- package/graphql/index.js.map +0 -1
- package/graphql/utils.d.ts +0 -11
- package/graphql/utils.js +0 -12
- package/graphql/utils.js.map +0 -1
- package/modelModifier/CmsModelModifier.d.ts +0 -26
- package/modelModifier/CmsModelModifier.js +0 -51
- package/modelModifier/CmsModelModifier.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/upload/utils/FileNormalizer.js","sources":["../../../../src/features/upload/utils/FileNormalizer.ts"],"sourcesContent":["import { mdbid } from \"@webiny/utils\";\nimport type { FileData, PresignedPostPayloadData } from \"~/features/upload/types.js\";\nimport { FileKey } from \"./FileKey.js\";\nimport { mimeTypes } from \"./mimeTypes.js\";\nimport type { FileModifier } from \"./FileUploadModifier.js\";\n\nexport interface FileToSign {\n name: string;\n key: string;\n type: string;\n size: number;\n}\n\nconst extensionToMime = new Map<string, string>();\nfor (const [mime, extensions] of Object.entries(mimeTypes)) {\n for (const ext of extensions) {\n if (!extensionToMime.has(ext)) {\n extensionToMime.set(ext, mime);\n }\n }\n}\n\nfunction resolveTypeFromName(name: string): string {\n const ext = name.slice(name.lastIndexOf(\".\") + 1).toLowerCase();\n return extensionToMime.get(ext) || \"application/octet-stream\";\n}\n\n/*\n * FileNormalizer normalizes file data, before it's signed for upload.\n * It generates a unique file id, and makes sure that the file key includes the unique id.\n */\nexport class FileNormalizer {\n private readonly modifier: FileModifier | undefined;\n\n constructor(modifier?: FileModifier) {\n this.modifier = modifier;\n }\n\n async normalizeFile(payload: PresignedPostPayloadData): Promise<FileData> {\n const data = {\n ...payload,\n id: payload.id || mdbid(),\n type: payload.type || resolveTypeFromName(payload.name)\n };\n\n const key = new FileKey(data);\n const defaultKey = key.toString();\n\n const file: FileToSign = {\n name: data.name,\n type: data.type,\n key: defaultKey,\n size: data.size\n };\n\n if (this.modifier) {\n Object.assign(file, await this.modifier(file));\n }\n\n if (defaultKey !== file.key) {\n key.setKey(file.key);\n }\n\n return {\n id: data.id,\n key: key.toString(),\n name: file.name,\n size: file.size,\n type: file.type\n };\n }\n}\n"],"names":["extensionToMime","Map","mime","extensions","Object","mimeTypes","ext","resolveTypeFromName","name","FileNormalizer","modifier","payload","data","mdbid","key","FileKey","defaultKey","file"],"mappings":";;;AAaA,MAAMA,kBAAkB,IAAIC;AAC5B,KAAK,MAAM,CAACC,MAAMC,WAAW,IAAIC,OAAO,OAAO,CAACC,iCAC5C,KAAK,MAAMC,OAAOH,WACd,IAAI,CAACH,gBAAgB,GAAG,CAACM,MACrBN,gBAAgB,GAAG,CAACM,KAAKJ;AAKrC,SAASK,oBAAoBC,IAAY;IACrC,MAAMF,MAAME,KAAK,KAAK,CAACA,KAAK,WAAW,CAAC,OAAO,GAAG,WAAW;IAC7D,OAAOR,gBAAgB,GAAG,CAACM,QAAQ;AACvC;AAMO,MAAMG;IAGT,YAAYC,QAAuB,CAAE;QACjC,IAAI,CAAC,QAAQ,GAAGA;IACpB;IAEA,MAAM,cAAcC,OAAiC,EAAqB;QACtE,MAAMC,OAAO;YACT,GAAGD,OAAO;YACV,IAAIA,QAAQ,EAAE,IAAIE;YAClB,MAAMF,QAAQ,IAAI,IAAIJ,oBAAoBI,QAAQ,IAAI;QAC1D;QAEA,MAAMG,MAAM,IAAIC,QAAQH;QACxB,MAAMI,aAAaF,IAAI,QAAQ;QAE/B,MAAMG,OAAmB;YACrB,MAAML,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;YACf,KAAKI;YACL,MAAMJ,KAAK,IAAI;QACnB;QAEA,IAAI,IAAI,CAAC,QAAQ,EACbR,OAAO,MAAM,CAACa,MAAM,MAAM,IAAI,CAAC,QAAQ,CAACA;QAG5C,IAAID,eAAeC,KAAK,GAAG,EACvBH,IAAI,MAAM,CAACG,KAAK,GAAG;QAGvB,OAAO;YACH,IAAIL,KAAK,EAAE;YACX,KAAKE,IAAI,QAAQ;YACjB,MAAMG,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;YACf,MAAMA,KAAK,IAAI;QACnB;IACJ;AACJ"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Plugin } from "@webiny/plugins";
|
|
2
|
+
import type { FileToSign } from "./FileNormalizer.js";
|
|
3
|
+
interface Setter<T> {
|
|
4
|
+
(param: T): T;
|
|
5
|
+
}
|
|
6
|
+
declare class FileUploadModifier {
|
|
7
|
+
private fileSetters;
|
|
8
|
+
setFile(setter: Setter<FileToSign>): void;
|
|
9
|
+
execute(file: FileToSign): Promise<FileToSign>;
|
|
10
|
+
}
|
|
11
|
+
interface FileUploadModifierCallbackParams {
|
|
12
|
+
modifier: {
|
|
13
|
+
setFile: FileUploadModifier["setFile"];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare class FileUploadModifierPlugin extends Plugin {
|
|
17
|
+
static type: string;
|
|
18
|
+
private readonly cb;
|
|
19
|
+
constructor(cb: FileUploadModifierCallable);
|
|
20
|
+
execute(params: FileUploadModifierCallbackParams): void;
|
|
21
|
+
}
|
|
22
|
+
interface FileUploadModifierCallable {
|
|
23
|
+
(params: FileUploadModifierCallbackParams): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const createFileUploadModifier: (cb: FileUploadModifierCallable) => FileUploadModifierPlugin;
|
|
26
|
+
export interface FileModifier {
|
|
27
|
+
(file: FileToSign): Promise<Partial<FileToSign>> | Partial<FileToSign>;
|
|
28
|
+
}
|
|
29
|
+
export declare const createModifierFromPlugins: (plugins?: FileUploadModifierPlugin[]) => FileModifier;
|
|
30
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import p_reduce from "p-reduce";
|
|
2
|
+
import { Plugin } from "@webiny/plugins";
|
|
3
|
+
class FileUploadModifier {
|
|
4
|
+
setFile(setter) {
|
|
5
|
+
this.fileSetters.push(setter);
|
|
6
|
+
}
|
|
7
|
+
execute(file) {
|
|
8
|
+
return p_reduce(this.fileSetters, async (file, setter)=>({
|
|
9
|
+
...file,
|
|
10
|
+
...await setter(file)
|
|
11
|
+
}), file);
|
|
12
|
+
}
|
|
13
|
+
constructor(){
|
|
14
|
+
this.fileSetters = [];
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class FileUploadModifierPlugin extends Plugin {
|
|
18
|
+
static{
|
|
19
|
+
this.type = "fm.uploadModifier";
|
|
20
|
+
}
|
|
21
|
+
constructor(cb){
|
|
22
|
+
super();
|
|
23
|
+
this.cb = cb;
|
|
24
|
+
}
|
|
25
|
+
execute(params) {
|
|
26
|
+
return this.cb(params);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const createFileUploadModifier = (cb)=>new FileUploadModifierPlugin(cb);
|
|
30
|
+
const createModifierFromPlugins = (plugins = [])=>{
|
|
31
|
+
const modifier = new FileUploadModifier();
|
|
32
|
+
plugins.forEach((pl)=>pl.execute({
|
|
33
|
+
modifier
|
|
34
|
+
}));
|
|
35
|
+
return (file)=>modifier.execute(file);
|
|
36
|
+
};
|
|
37
|
+
export { FileUploadModifierPlugin, createFileUploadModifier, createModifierFromPlugins };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=FileUploadModifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/upload/utils/FileUploadModifier.js","sources":["../../../../src/features/upload/utils/FileUploadModifier.ts"],"sourcesContent":["import pReduce from \"p-reduce\";\nimport { Plugin } from \"@webiny/plugins\";\nimport type { FileToSign } from \"./FileNormalizer.js\";\n\ninterface Setter<T> {\n (param: T): T;\n}\n\nclass FileUploadModifier {\n private fileSetters: Setter<FileToSign>[] = [];\n\n setFile(setter: Setter<FileToSign>): void {\n this.fileSetters.push(setter);\n }\n\n execute(file: FileToSign) {\n return pReduce(\n this.fileSetters,\n async (file, setter) => {\n /* We need to spread the original file, then add (potentially) partial changes. */\n return { ...file, ...(await setter(file)) };\n },\n file\n );\n }\n}\n\ninterface FileUploadModifierCallbackParams {\n modifier: {\n setFile: FileUploadModifier[\"setFile\"];\n };\n}\n\nexport class FileUploadModifierPlugin extends Plugin {\n public static override type = \"fm.uploadModifier\";\n private readonly cb: FileUploadModifierCallable;\n\n constructor(cb: FileUploadModifierCallable) {\n super();\n this.cb = cb;\n }\n\n execute(params: FileUploadModifierCallbackParams) {\n return this.cb(params);\n }\n}\n\ninterface FileUploadModifierCallable {\n (params: FileUploadModifierCallbackParams): void;\n}\n\nexport const createFileUploadModifier = (cb: FileUploadModifierCallable) => {\n return new FileUploadModifierPlugin(cb);\n};\n\nexport interface FileModifier {\n (file: FileToSign): Promise<Partial<FileToSign>> | Partial<FileToSign>;\n}\n\nexport const createModifierFromPlugins = (\n plugins: FileUploadModifierPlugin[] = []\n): FileModifier => {\n const modifier = new FileUploadModifier();\n plugins.forEach(pl => pl.execute({ modifier }));\n\n return (file: FileToSign) => modifier.execute(file);\n};\n"],"names":["FileUploadModifier","setter","file","pReduce","FileUploadModifierPlugin","Plugin","cb","params","createFileUploadModifier","createModifierFromPlugins","plugins","modifier","pl"],"mappings":";;AAQA,MAAMA;IAGF,QAAQC,MAA0B,EAAQ;QACtC,IAAI,CAAC,WAAW,CAAC,IAAI,CAACA;IAC1B;IAEA,QAAQC,IAAgB,EAAE;QACtB,OAAOC,SACH,IAAI,CAAC,WAAW,EAChB,OAAOD,MAAMD,SAEF;gBAAE,GAAGC,IAAI;gBAAE,GAAI,MAAMD,OAAOC,KAAK;YAAE,IAE9CA;IAER;;aAfQ,WAAW,GAAyB,EAAE;;AAgBlD;AAQO,MAAME,iCAAiCC;;aACnB,IAAI,GAAG;;IAG9B,YAAYC,EAA8B,CAAE;QACxC,KAAK;QACL,IAAI,CAAC,EAAE,GAAGA;IACd;IAEA,QAAQC,MAAwC,EAAE;QAC9C,OAAO,IAAI,CAAC,EAAE,CAACA;IACnB;AACJ;AAMO,MAAMC,2BAA2B,CAACF,KAC9B,IAAIF,yBAAyBE;AAOjC,MAAMG,4BAA4B,CACrCC,UAAsC,EAAE;IAExC,MAAMC,WAAW,IAAIX;IACrBU,QAAQ,OAAO,CAACE,CAAAA,KAAMA,GAAG,OAAO,CAAC;YAAED;QAAS;IAE5C,OAAO,CAACT,OAAqBS,SAAS,OAAO,CAACT;AAClD"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FilePermission } from "../../../types.js";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
export declare const checkPermissions: (identityContext: IdentityContext.Interface, check?: {
|
|
4
|
+
rwd?: string;
|
|
5
|
+
}) => Promise<FilePermission[]>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
|
|
2
|
+
const checkPermissions = async (identityContext, check = {})=>{
|
|
3
|
+
const filePermissions = await identityContext.getPermissions("fm.file");
|
|
4
|
+
const relevantFilePermissions = filePermissions.filter((current)=>{
|
|
5
|
+
if (check.rwd && !hasRwd(current, check.rwd)) return false;
|
|
6
|
+
return true;
|
|
7
|
+
});
|
|
8
|
+
if (0 === relevantFilePermissions.length) throw new NotAuthorizedError();
|
|
9
|
+
return relevantFilePermissions;
|
|
10
|
+
};
|
|
11
|
+
const hasRwd = (filesFilePermissions, rwd)=>{
|
|
12
|
+
if (!Array.isArray(filesFilePermissions)) filesFilePermissions = [
|
|
13
|
+
filesFilePermissions
|
|
14
|
+
];
|
|
15
|
+
if (!rwd) return true;
|
|
16
|
+
const permissionWithoutRwdRestrictions = filesFilePermissions.some((permission)=>"string" != typeof permission.rwd);
|
|
17
|
+
if (permissionWithoutRwdRestrictions) return true;
|
|
18
|
+
return filesFilePermissions.some((permission)=>permission.rwd && permission.rwd.includes(rwd));
|
|
19
|
+
};
|
|
20
|
+
export { checkPermissions };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=checkPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/upload/utils/checkPermissions.js","sources":["../../../../src/features/upload/utils/checkPermissions.ts"],"sourcesContent":["import type { FilePermission } from \"~/types.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nexport const checkPermissions = async (\n identityContext: IdentityContext.Interface,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await identityContext.getPermissions<FilePermission>(\"fm.file\");\n\n const relevantFilePermissions = filePermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevantFilePermissions.length === 0) {\n throw new NotAuthorizedError();\n }\n\n return relevantFilePermissions;\n};\n\nconst hasRwd = (filesFilePermissions: FilePermission | FilePermission[], rwd: string): boolean => {\n if (!Array.isArray(filesFilePermissions)) {\n filesFilePermissions = [filesFilePermissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n /* Is there a permission that doesn't restrict RWD, all RWD permissions are allowed. */\n const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n return filesFilePermissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"names":["checkPermissions","identityContext","check","filePermissions","relevantFilePermissions","current","hasRwd","NotAuthorizedError","filesFilePermissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";AAIO,MAAMA,mBAAmB,OAC5BC,iBACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,gBAAgB,cAAc,CAAiB;IAE7E,MAAMG,0BAA0BD,gBAAgB,MAAM,CAACE,CAAAA;QACnD,IAAIH,MAAM,GAAG,IAAI,CAACI,OAAOD,SAASH,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIE,AAAmC,MAAnCA,wBAAwB,MAAM,EAC9B,MAAM,IAAIG;IAGd,OAAOH;AACX;AAEA,MAAME,SAAS,CAACE,sBAAyDC;IACrE,IAAI,CAACC,MAAM,OAAO,CAACF,uBACfA,uBAAuB;QAACA;KAAqB;IAGjD,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,qBAAqB,IAAI,CAACI,CAAAA,aACxD,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAGX,OAAOH,qBAAqB,IAAI,CAACI,CAAAA,aACtBA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FileNormalizer } from "./FileNormalizer.js";
|
|
2
|
+
import { FileUploadModifierPlugin, createModifierFromPlugins } from "./FileUploadModifier.js";
|
|
3
|
+
const createFileNormalizerFromContext = (context)=>{
|
|
4
|
+
const modifierPlugins = context.plugins.byType(FileUploadModifierPlugin.type);
|
|
5
|
+
return new FileNormalizer(createModifierFromPlugins(modifierPlugins));
|
|
6
|
+
};
|
|
7
|
+
export { createFileNormalizerFromContext };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=createFileNormalizerFromContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/upload/utils/createFileNormalizerFromContext.js","sources":["../../../../src/features/upload/utils/createFileNormalizerFromContext.ts"],"sourcesContent":["import type { Context } from \"@webiny/api/types.js\";\nimport { FileNormalizer } from \"./FileNormalizer.js\";\nimport { createModifierFromPlugins } from \"./FileUploadModifier.js\";\nimport { FileUploadModifierPlugin } from \"./FileUploadModifier.js\";\n\nexport const createFileNormalizerFromContext = (context: Context) => {\n const modifierPlugins = context.plugins.byType<FileUploadModifierPlugin>(\n FileUploadModifierPlugin.type\n );\n\n return new FileNormalizer(createModifierFromPlugins(modifierPlugins));\n};\n"],"names":["createFileNormalizerFromContext","context","modifierPlugins","FileUploadModifierPlugin","FileNormalizer","createModifierFromPlugins"],"mappings":";;AAKO,MAAMA,kCAAkC,CAACC;IAC5C,MAAMC,kBAAkBD,QAAQ,OAAO,CAAC,MAAM,CAC1CE,yBAAyB,IAAI;IAGjC,OAAO,IAAIC,eAAeC,0BAA0BH;AACxD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const mimeTypes: Record<string, string[]>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/upload/utils/mimeTypes.js","sources":["../../../../src/features/upload/utils/mimeTypes.ts"],"sourcesContent":["import vendorTypes from \"mime/types/other.js\";\nimport standardTypes from \"mime/types/standard.js\";\n\n/*\n * We need to get all extensions that are defined for a specific content type.\n * This operation is not available via the `mime` package, so we create such an object ourselves.\n */\nexport const mimeTypes: Record<string, string[]> = {\n ...vendorTypes,\n ...standardTypes\n};\n"],"names":["mimeTypes","vendorTypes","standardTypes"],"mappings":";;AAOO,MAAMA,sBAAsC;IAC/C,GAAGC,KAAW;IACd,GAAGC,QAAa;AACpB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { GraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
|
|
2
|
+
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
|
|
3
|
+
import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
|
|
4
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
5
|
+
import { FileModelProvider } from "../domain/file/abstractions.js";
|
|
6
|
+
declare class FmGraphQLSchema_ implements GraphQLSchemaFactory.Interface {
|
|
7
|
+
private readonly identityContext;
|
|
8
|
+
private readonly listModelsUseCase;
|
|
9
|
+
private readonly fieldRegistry;
|
|
10
|
+
private readonly fileModelProvider;
|
|
11
|
+
constructor(identityContext: IdentityContext.Interface, listModelsUseCase: ListModelsUseCase.Interface, fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface, fileModelProvider: FileModelProvider.Interface);
|
|
12
|
+
getSchemaKey(): Promise<string>;
|
|
13
|
+
execute(builder: GraphQLSchemaFactory.SchemaBuilder): Promise<GraphQLSchemaFactory.SchemaBuilder>;
|
|
14
|
+
private addBaseTypeDefs;
|
|
15
|
+
private addFileTypeDefs;
|
|
16
|
+
private addSettingsResolvers;
|
|
17
|
+
private addFileQueryResolvers;
|
|
18
|
+
private addFileMutationResolvers;
|
|
19
|
+
private loadModels;
|
|
20
|
+
}
|
|
21
|
+
export declare const FmGraphQLSchema: typeof FmGraphQLSchema_ & {
|
|
22
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-graphql/graphql/abstractions.public").IGraphQLSchemaFactory>;
|
|
23
|
+
};
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,459 @@
|
|
|
1
|
+
import { GraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
|
|
2
|
+
import { createModelSchemaKey } from "@webiny/api-headless-cms/utils/createModelSchemaKey.js";
|
|
3
|
+
import { ErrorResponse, ListResponse, NotFoundResponse, Response } from "@webiny/api-graphql";
|
|
4
|
+
import { renderFields } from "@webiny/api-headless-cms/utils/renderFields.js";
|
|
5
|
+
import { renderInputFields } from "@webiny/api-headless-cms/utils/renderInputFields.js";
|
|
6
|
+
import { renderListFilterFields } from "@webiny/api-headless-cms/utils/renderListFilterFields.js";
|
|
7
|
+
import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
|
|
8
|
+
import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
|
|
9
|
+
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
10
|
+
import { GetFileUseCase } from "../features/file/GetFile/abstractions.js";
|
|
11
|
+
import { ListFilesUseCase } from "../features/file/ListFiles/abstractions.js";
|
|
12
|
+
import { ListTagsUseCase } from "../features/file/ListTags/abstractions.js";
|
|
13
|
+
import { CreateFileUseCase } from "../features/file/CreateFile/abstractions.js";
|
|
14
|
+
import { CreateFilesInBatchUseCase } from "../features/file/CreateFilesInBatch/abstractions.js";
|
|
15
|
+
import { UpdateFileUseCase } from "../features/file/UpdateFile/abstractions.js";
|
|
16
|
+
import { DeleteFileUseCase } from "../features/file/DeleteFile/abstractions.js";
|
|
17
|
+
import { GetFileByUrlUseCase } from "../features/file/GetFileByUrl/abstractions.js";
|
|
18
|
+
import { GetSettingsUseCase } from "../features/settings/GetSettings/abstractions.js";
|
|
19
|
+
import { UpdateSettingsUseCase } from "../features/settings/UpdateSettings/abstractions.js";
|
|
20
|
+
import { FileUrlGenerator } from "../features/file/FileUrlGenerator/abstractions.js";
|
|
21
|
+
import { FileModelProvider } from "../domain/file/abstractions.js";
|
|
22
|
+
const removeFieldRequiredValidation = (field)=>{
|
|
23
|
+
if (field.validation) field.validation = field.validation.filter((validation)=>"required" !== validation.name);
|
|
24
|
+
if (field.listValidation) field.listValidation = field.listValidation.filter((v)=>"required" !== v.name);
|
|
25
|
+
return field;
|
|
26
|
+
};
|
|
27
|
+
const createUpdateFields = (fields)=>fields.reduce((collection, field)=>{
|
|
28
|
+
collection.push(removeFieldRequiredValidation({
|
|
29
|
+
...field
|
|
30
|
+
}));
|
|
31
|
+
return collection;
|
|
32
|
+
}, []);
|
|
33
|
+
class FmGraphQLSchema_ {
|
|
34
|
+
constructor(identityContext, listModelsUseCase, fieldRegistry, fileModelProvider){
|
|
35
|
+
this.identityContext = identityContext;
|
|
36
|
+
this.listModelsUseCase = listModelsUseCase;
|
|
37
|
+
this.fieldRegistry = fieldRegistry;
|
|
38
|
+
this.fileModelProvider = fileModelProvider;
|
|
39
|
+
}
|
|
40
|
+
async getSchemaKey() {
|
|
41
|
+
const models = await this.loadModels();
|
|
42
|
+
const fileModel = await this.fileModelProvider.get();
|
|
43
|
+
const modelKey = createModelSchemaKey([
|
|
44
|
+
fileModel
|
|
45
|
+
], models);
|
|
46
|
+
return `FileManager:${modelKey}`;
|
|
47
|
+
}
|
|
48
|
+
async execute(builder) {
|
|
49
|
+
this.addBaseTypeDefs(builder);
|
|
50
|
+
await this.addFileTypeDefs(builder);
|
|
51
|
+
this.addSettingsResolvers(builder);
|
|
52
|
+
this.addFileQueryResolvers(builder);
|
|
53
|
+
this.addFileMutationResolvers(builder);
|
|
54
|
+
return builder;
|
|
55
|
+
}
|
|
56
|
+
addBaseTypeDefs(builder) {
|
|
57
|
+
builder.addTypeDefs(`
|
|
58
|
+
type FmError {
|
|
59
|
+
code: String
|
|
60
|
+
message: String
|
|
61
|
+
data: JSON
|
|
62
|
+
stack: String
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
type FmCreatedBy {
|
|
66
|
+
id: ID
|
|
67
|
+
displayName: String
|
|
68
|
+
type: String
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
type FmListMeta {
|
|
72
|
+
cursor: String
|
|
73
|
+
totalCount: Int
|
|
74
|
+
hasMoreItems: Boolean
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
type FmBooleanResponse {
|
|
78
|
+
data: Boolean
|
|
79
|
+
error: FmError
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
type FmSettings {
|
|
83
|
+
uploadMinFileSize: Number
|
|
84
|
+
uploadMaxFileSize: Number
|
|
85
|
+
srcPrefix: String
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
input FmSettingsInput {
|
|
89
|
+
uploadMinFileSize: Number
|
|
90
|
+
uploadMaxFileSize: Number
|
|
91
|
+
srcPrefix: String
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
type FmSettingsResponse {
|
|
95
|
+
data: FmSettings
|
|
96
|
+
error: FmError
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
type FmDeleteResponse {
|
|
100
|
+
data: Boolean
|
|
101
|
+
error: FmError
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
type FmQuery {
|
|
105
|
+
getSettings: FmSettingsResponse
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
type FmMutation {
|
|
109
|
+
updateSettings(data: FmSettingsInput): FmSettingsResponse
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
extend type Query {
|
|
113
|
+
fileManager: FmQuery
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
extend type Mutation {
|
|
117
|
+
fileManager: FmMutation
|
|
118
|
+
}
|
|
119
|
+
`);
|
|
120
|
+
builder.addResolver({
|
|
121
|
+
path: "Query.fileManager",
|
|
122
|
+
resolver: ()=>()=>({})
|
|
123
|
+
});
|
|
124
|
+
builder.addResolver({
|
|
125
|
+
path: "Mutation.fileManager",
|
|
126
|
+
resolver: ()=>()=>({})
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
async addFileTypeDefs(builder) {
|
|
130
|
+
const models = await this.loadModels();
|
|
131
|
+
const fileModel = await this.fileModelProvider.get();
|
|
132
|
+
const { fields } = fileModel;
|
|
133
|
+
const fieldTypes = renderFields({
|
|
134
|
+
models,
|
|
135
|
+
model: fileModel,
|
|
136
|
+
fields,
|
|
137
|
+
type: "manage",
|
|
138
|
+
fieldRegistry: this.fieldRegistry
|
|
139
|
+
});
|
|
140
|
+
const inputCreateFields = renderInputFields({
|
|
141
|
+
models,
|
|
142
|
+
model: fileModel,
|
|
143
|
+
fields,
|
|
144
|
+
fieldRegistry: this.fieldRegistry
|
|
145
|
+
});
|
|
146
|
+
const inputUpdateFields = renderInputFields({
|
|
147
|
+
models,
|
|
148
|
+
model: fileModel,
|
|
149
|
+
fields: createUpdateFields(fields),
|
|
150
|
+
fieldRegistry: this.fieldRegistry
|
|
151
|
+
});
|
|
152
|
+
const listFilterFieldsRender = renderListFilterFields({
|
|
153
|
+
model: fileModel,
|
|
154
|
+
fields: fileModel.fields,
|
|
155
|
+
type: "manage",
|
|
156
|
+
fieldRegistry: this.fieldRegistry,
|
|
157
|
+
excludeFields: [
|
|
158
|
+
"entryId",
|
|
159
|
+
"status"
|
|
160
|
+
]
|
|
161
|
+
});
|
|
162
|
+
builder.addTypeDefs(`
|
|
163
|
+
type FmFile_Location {
|
|
164
|
+
folderId: ID!
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
input FmFile_LocationInput {
|
|
168
|
+
folderId: ID!
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
input FmFile_LocationWhereInput {
|
|
172
|
+
folderId: ID
|
|
173
|
+
folderId_in: [ID!]
|
|
174
|
+
folderId_not: ID
|
|
175
|
+
folderId_not_in: [ID!]
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
${fieldTypes.map((f)=>f.typeDefs).join("\n")}
|
|
179
|
+
|
|
180
|
+
type FmFile {
|
|
181
|
+
id: ID!
|
|
182
|
+
createdOn: DateTime!
|
|
183
|
+
modifiedOn: DateTime
|
|
184
|
+
savedOn: DateTime!
|
|
185
|
+
createdBy: FmCreatedBy!
|
|
186
|
+
modifiedBy: FmCreatedBy
|
|
187
|
+
savedBy: FmCreatedBy!
|
|
188
|
+
location: FmFile_Location!
|
|
189
|
+
src: String
|
|
190
|
+
${fieldTypes.map((f)=>f.fields).join("\n")}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
${inputCreateFields.map((f)=>f.typeDefs).join("\n")}
|
|
194
|
+
|
|
195
|
+
input FmCreatedByInput {
|
|
196
|
+
id: ID!
|
|
197
|
+
displayName: String!
|
|
198
|
+
type: String!
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
input FmFileCreateInput {
|
|
202
|
+
id: ID!
|
|
203
|
+
createdOn: DateTime
|
|
204
|
+
modifiedOn: DateTime
|
|
205
|
+
savedOn: DateTime
|
|
206
|
+
createdBy: FmCreatedByInput
|
|
207
|
+
modifiedBy: FmCreatedByInput
|
|
208
|
+
savedBy: FmCreatedByInput
|
|
209
|
+
location: FmFile_LocationInput
|
|
210
|
+
${inputCreateFields.map((f)=>f.fields).join("\n")}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
input FmFileUpdateInput {
|
|
214
|
+
createdOn: DateTime
|
|
215
|
+
modifiedOn: DateTime
|
|
216
|
+
savedOn: DateTime
|
|
217
|
+
createdBy: FmCreatedByInput
|
|
218
|
+
modifiedBy: FmCreatedByInput
|
|
219
|
+
savedBy: FmCreatedByInput
|
|
220
|
+
location: FmFile_LocationInput
|
|
221
|
+
${inputUpdateFields.map((f)=>f.fields).join("\n")}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
type FmFileResponse {
|
|
225
|
+
data: FmFile
|
|
226
|
+
error: FmError
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
input FmFileListWhereInput {
|
|
230
|
+
${listFilterFieldsRender.allFiltersAsString()}
|
|
231
|
+
location: FmFile_LocationWhereInput
|
|
232
|
+
AND: [FmFileListWhereInput!]
|
|
233
|
+
OR: [FmFileListWhereInput!]
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
type FmFileListResponse {
|
|
237
|
+
data: [FmFile!]
|
|
238
|
+
error: FmError
|
|
239
|
+
meta: FmListMeta
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
enum FmFileListSorter {
|
|
243
|
+
savedOn_ASC
|
|
244
|
+
savedOn_DESC
|
|
245
|
+
createdOn_ASC
|
|
246
|
+
createdOn_DESC
|
|
247
|
+
name_ASC
|
|
248
|
+
name_DESC
|
|
249
|
+
key_ASC
|
|
250
|
+
key_DESC
|
|
251
|
+
type_ASC
|
|
252
|
+
type_DESC
|
|
253
|
+
size_ASC
|
|
254
|
+
size_DESC
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
input FmTagsListWhereInput {
|
|
258
|
+
createdBy: String
|
|
259
|
+
tags_startsWith: String
|
|
260
|
+
tags_not_startsWith: String
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
type FmTag {
|
|
264
|
+
tag: String!
|
|
265
|
+
count: Number!
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
type FmTagsListResponse {
|
|
269
|
+
data: [FmTag!]
|
|
270
|
+
error: FmError
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
type FmCreateFilesResponse {
|
|
274
|
+
data: [FmFile!]
|
|
275
|
+
error: FmError
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
type FmFileModelResponse {
|
|
279
|
+
data: JSON
|
|
280
|
+
error: FmError
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
extend type FmQuery {
|
|
284
|
+
getFileModel: FmFileModelResponse!
|
|
285
|
+
getFile(id: ID!): FmFileResponse!
|
|
286
|
+
getFileByUrl(url: String!): FmFileResponse
|
|
287
|
+
listFiles(
|
|
288
|
+
search: String
|
|
289
|
+
where: FmFileListWhereInput
|
|
290
|
+
limit: Int
|
|
291
|
+
after: String
|
|
292
|
+
sort: [FmFileListSorter!]
|
|
293
|
+
): FmFileListResponse!
|
|
294
|
+
listTags(where: FmTagsListWhereInput): FmTagsListResponse!
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
extend type FmMutation {
|
|
298
|
+
createFile(data: FmFileCreateInput!): FmFileResponse!
|
|
299
|
+
createFiles(data: [FmFileCreateInput!]!): FmCreateFilesResponse!
|
|
300
|
+
updateFile(id: ID!, data: FmFileUpdateInput!): FmFileResponse!
|
|
301
|
+
deleteFile(id: ID!): FmBooleanResponse!
|
|
302
|
+
}
|
|
303
|
+
`);
|
|
304
|
+
}
|
|
305
|
+
addSettingsResolvers(builder) {
|
|
306
|
+
builder.addResolver({
|
|
307
|
+
path: "FmQuery.getSettings",
|
|
308
|
+
dependencies: [
|
|
309
|
+
GetSettingsUseCase
|
|
310
|
+
],
|
|
311
|
+
resolver: (getSettings)=>async ()=>{
|
|
312
|
+
const result = await getSettings.execute();
|
|
313
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
314
|
+
return new Response(result.value);
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
builder.addResolver({
|
|
318
|
+
path: "FmMutation.updateSettings",
|
|
319
|
+
dependencies: [
|
|
320
|
+
UpdateSettingsUseCase
|
|
321
|
+
],
|
|
322
|
+
resolver: (updateSettings)=>async ({ args })=>{
|
|
323
|
+
const result = await updateSettings.execute(args.data);
|
|
324
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
325
|
+
return new Response(result.value);
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
}
|
|
329
|
+
addFileQueryResolvers(builder) {
|
|
330
|
+
builder.addResolver({
|
|
331
|
+
path: "FmFile.src",
|
|
332
|
+
dependencies: [
|
|
333
|
+
FileUrlGenerator
|
|
334
|
+
],
|
|
335
|
+
resolver: (urlGenerator)=>({ parent })=>urlGenerator.generateUrl(parent)
|
|
336
|
+
});
|
|
337
|
+
builder.addResolver({
|
|
338
|
+
path: "FmQuery.getFileModel",
|
|
339
|
+
dependencies: [
|
|
340
|
+
FileModelProvider
|
|
341
|
+
],
|
|
342
|
+
resolver: (fileModelProvider)=>async ()=>new Response(await fileModelProvider.get())
|
|
343
|
+
});
|
|
344
|
+
builder.addResolver({
|
|
345
|
+
path: "FmQuery.getFile",
|
|
346
|
+
dependencies: [
|
|
347
|
+
GetFileUseCase
|
|
348
|
+
],
|
|
349
|
+
resolver: (getFile)=>async ({ args })=>{
|
|
350
|
+
const result = await getFile.execute(args.id);
|
|
351
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
352
|
+
return new Response(result.value);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
builder.addResolver({
|
|
356
|
+
path: "FmQuery.listFiles",
|
|
357
|
+
dependencies: [
|
|
358
|
+
ListFilesUseCase
|
|
359
|
+
],
|
|
360
|
+
resolver: (listFiles)=>async ({ args })=>{
|
|
361
|
+
const result = await listFiles.execute(args);
|
|
362
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
363
|
+
return new ListResponse(result.value.items, result.value.meta);
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
builder.addResolver({
|
|
367
|
+
path: "FmQuery.listTags",
|
|
368
|
+
dependencies: [
|
|
369
|
+
ListTagsUseCase
|
|
370
|
+
],
|
|
371
|
+
resolver: (listTags)=>async ({ args })=>{
|
|
372
|
+
const result = await listTags.execute(args || {});
|
|
373
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
374
|
+
return new Response(result.value);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
377
|
+
builder.addResolver({
|
|
378
|
+
path: "FmQuery.getFileByUrl",
|
|
379
|
+
dependencies: [
|
|
380
|
+
GetFileByUrlUseCase
|
|
381
|
+
],
|
|
382
|
+
resolver: (getFileByUrl)=>async ({ args })=>{
|
|
383
|
+
const result = await getFileByUrl.execute(args.url);
|
|
384
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
385
|
+
if (!result.value) return new NotFoundResponse("File not found!");
|
|
386
|
+
return new Response(result.value);
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
addFileMutationResolvers(builder) {
|
|
391
|
+
builder.addResolver({
|
|
392
|
+
path: "FmMutation.createFile",
|
|
393
|
+
dependencies: [
|
|
394
|
+
CreateFileUseCase
|
|
395
|
+
],
|
|
396
|
+
resolver: (createFile)=>async ({ args })=>{
|
|
397
|
+
const result = await createFile.execute(args.data);
|
|
398
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
399
|
+
return new Response(result.value);
|
|
400
|
+
}
|
|
401
|
+
});
|
|
402
|
+
builder.addResolver({
|
|
403
|
+
path: "FmMutation.createFiles",
|
|
404
|
+
dependencies: [
|
|
405
|
+
CreateFilesInBatchUseCase
|
|
406
|
+
],
|
|
407
|
+
resolver: (createFilesInBatch)=>async ({ args })=>{
|
|
408
|
+
const result = await createFilesInBatch.execute({
|
|
409
|
+
files: args.data,
|
|
410
|
+
meta: args.meta
|
|
411
|
+
});
|
|
412
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
413
|
+
return new Response(result.value);
|
|
414
|
+
}
|
|
415
|
+
});
|
|
416
|
+
builder.addResolver({
|
|
417
|
+
path: "FmMutation.updateFile",
|
|
418
|
+
dependencies: [
|
|
419
|
+
UpdateFileUseCase
|
|
420
|
+
],
|
|
421
|
+
resolver: (updateFile)=>async ({ args })=>{
|
|
422
|
+
const result = await updateFile.execute({
|
|
423
|
+
id: args.id,
|
|
424
|
+
...args.data
|
|
425
|
+
});
|
|
426
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
427
|
+
return new Response(result.value);
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
builder.addResolver({
|
|
431
|
+
path: "FmMutation.deleteFile",
|
|
432
|
+
dependencies: [
|
|
433
|
+
DeleteFileUseCase
|
|
434
|
+
],
|
|
435
|
+
resolver: (deleteFile)=>async ({ args })=>{
|
|
436
|
+
const result = await deleteFile.execute(args.id);
|
|
437
|
+
if (result.isFail()) return new ErrorResponse(result.error);
|
|
438
|
+
return new Response(true);
|
|
439
|
+
}
|
|
440
|
+
});
|
|
441
|
+
}
|
|
442
|
+
async loadModels() {
|
|
443
|
+
const modelsResult = await this.identityContext.withoutAuthorization(()=>this.listModelsUseCase.execute());
|
|
444
|
+
if (modelsResult.isFail()) throw modelsResult.error;
|
|
445
|
+
return modelsResult.value;
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
const FmGraphQLSchema = GraphQLSchemaFactory.createImplementation({
|
|
449
|
+
implementation: FmGraphQLSchema_,
|
|
450
|
+
dependencies: [
|
|
451
|
+
IdentityContext,
|
|
452
|
+
ListModelsUseCase,
|
|
453
|
+
CmsModelFieldToGraphQLRegistry,
|
|
454
|
+
FileModelProvider
|
|
455
|
+
]
|
|
456
|
+
});
|
|
457
|
+
export { FmGraphQLSchema };
|
|
458
|
+
|
|
459
|
+
//# sourceMappingURL=FmGraphQLSchema.js.map
|