@webiny/api-file-manager 6.3.0 → 6.4.0-beta.1
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/contants.js +2 -1
- package/contants.js.map +1 -1
- package/delivery/AssetDelivery/Asset.js +50 -56
- package/delivery/AssetDelivery/Asset.js.map +1 -1
- package/delivery/AssetDelivery/AssetDeliveryConfig.js +70 -83
- package/delivery/AssetDelivery/AssetDeliveryConfig.js.map +1 -1
- package/delivery/AssetDelivery/AssetRequest.js +20 -19
- package/delivery/AssetDelivery/AssetRequest.js.map +1 -1
- package/delivery/AssetDelivery/FilesAssetRequestResolver.js +19 -25
- package/delivery/AssetDelivery/FilesAssetRequestResolver.js.map +1 -1
- package/delivery/AssetDelivery/NullAssetOutputStrategy.js +5 -4
- package/delivery/AssetDelivery/NullAssetOutputStrategy.js.map +1 -1
- package/delivery/AssetDelivery/NullAssetReply.js +10 -9
- package/delivery/AssetDelivery/NullAssetReply.js.map +1 -1
- package/delivery/AssetDelivery/NullAssetResolver.js +5 -4
- package/delivery/AssetDelivery/NullAssetResolver.js.map +1 -1
- package/delivery/AssetDelivery/NullRequestResolver.js +5 -4
- package/delivery/AssetDelivery/NullRequestResolver.js.map +1 -1
- package/delivery/AssetDelivery/SetCacheControlHeaders.js +11 -14
- package/delivery/AssetDelivery/SetCacheControlHeaders.js.map +1 -1
- package/delivery/AssetDelivery/SetResponseHeaders.js +16 -15
- package/delivery/AssetDelivery/SetResponseHeaders.js.map +1 -1
- package/delivery/AssetDelivery/abstractions/AssetContentsReader.js +0 -3
- package/delivery/AssetDelivery/abstractions/AssetOutputStrategy.js +0 -3
- package/delivery/AssetDelivery/abstractions/AssetProcessor.js +0 -3
- package/delivery/AssetDelivery/abstractions/AssetReply.js +28 -27
- package/delivery/AssetDelivery/abstractions/AssetReply.js.map +1 -1
- package/delivery/AssetDelivery/abstractions/AssetRequestResolver.js +0 -3
- package/delivery/AssetDelivery/abstractions/AssetResolver.js +0 -3
- package/delivery/AssetDelivery/abstractions/AssetTransformationStrategy.js +0 -3
- package/delivery/AssetDelivery/createAssetDeliveryPluginLoader.js +4 -5
- package/delivery/AssetDelivery/createAssetDeliveryPluginLoader.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/AssetAuthorizer.js +0 -3
- package/delivery/AssetDelivery/privateFiles/NotAuthorizedAssetReply.js +15 -14
- package/delivery/AssetDelivery/privateFiles/NotAuthorizedAssetReply.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/NotAuthorizedOutputStrategy.js +5 -4
- package/delivery/AssetDelivery/privateFiles/NotAuthorizedOutputStrategy.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/PrivateAuthenticatedAuthorizer.js +14 -16
- package/delivery/AssetDelivery/privateFiles/PrivateAuthenticatedAuthorizer.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/PrivateCache.js +18 -17
- package/delivery/AssetDelivery/privateFiles/PrivateCache.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/PrivateFileAssetRequestResolver.js +21 -25
- package/delivery/AssetDelivery/privateFiles/PrivateFileAssetRequestResolver.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/PrivateFilesAssetProcessor.js +44 -51
- package/delivery/AssetDelivery/privateFiles/PrivateFilesAssetProcessor.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/PublicCache.js +18 -17
- package/delivery/AssetDelivery/privateFiles/PublicCache.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/RedirectToPrivateUrlOutputStrategy.js +16 -15
- package/delivery/AssetDelivery/privateFiles/RedirectToPrivateUrlOutputStrategy.js.map +1 -1
- package/delivery/AssetDelivery/privateFiles/RedirectToPublicUrlOutputStrategy.js +16 -15
- package/delivery/AssetDelivery/privateFiles/RedirectToPublicUrlOutputStrategy.js.map +1 -1
- package/delivery/AssetDelivery/transformation/PassthroughAssetProcessor.js +5 -4
- package/delivery/AssetDelivery/transformation/PassthroughAssetProcessor.js.map +1 -1
- package/delivery/AssetDelivery/transformation/PassthroughAssetTransformationStrategy.js +5 -4
- package/delivery/AssetDelivery/transformation/PassthroughAssetTransformationStrategy.js.map +1 -1
- package/delivery/AssetDelivery/transformation/TransformationAssetProcessor.js +12 -15
- package/delivery/AssetDelivery/transformation/TransformationAssetProcessor.js.map +1 -1
- package/delivery/index.js +0 -2
- package/delivery/setupAssetDelivery.js +70 -101
- package/delivery/setupAssetDelivery.js.map +1 -1
- package/domain/file/abstractions.js +2 -5
- package/domain/file/abstractions.js.map +1 -1
- package/domain/file/errors.js +67 -76
- package/domain/file/errors.js.map +1 -1
- package/domain/file/file.model.js +57 -49
- package/domain/file/file.model.js.map +1 -1
- package/domain/file/types.js +0 -3
- package/domain/identity/Identity.js +9 -8
- package/domain/identity/Identity.js.map +1 -1
- package/domain/permissionsSchema.js +26 -15
- package/domain/permissionsSchema.js.map +1 -1
- package/domain/settings/constants.js +2 -1
- package/domain/settings/constants.js.map +1 -1
- package/domain/settings/errors.js +22 -24
- package/domain/settings/errors.js.map +1 -1
- package/domain/settings/types.js +0 -3
- package/domain/settings/validation.js +18 -27
- package/domain/settings/validation.js.map +1 -1
- package/exports/api/file-manager/file.js +0 -2
- package/exports/api/file-manager/permissions.js +0 -2
- package/exports/api/file-manager/settings.js +0 -2
- package/features/FileManagerFeature.js +16 -15
- package/features/FileManagerFeature.js.map +1 -1
- package/features/file/CreateFile/CreateFileRepository.js +20 -18
- package/features/file/CreateFile/CreateFileRepository.js.map +1 -1
- package/features/file/CreateFile/CreateFileUseCase.js +68 -75
- package/features/file/CreateFile/CreateFileUseCase.js.map +1 -1
- package/features/file/CreateFile/abstractions.js +3 -14
- package/features/file/CreateFile/abstractions.js.map +1 -1
- package/features/file/CreateFile/events.js +17 -26
- package/features/file/CreateFile/events.js.map +1 -1
- package/features/file/CreateFile/feature.js +7 -6
- package/features/file/CreateFile/feature.js.map +1 -1
- package/features/file/CreateFile/index.js +0 -2
- package/features/file/CreateFilesInBatch/CreateFilesInBatchRepository.js +15 -17
- package/features/file/CreateFilesInBatch/CreateFilesInBatchRepository.js.map +1 -1
- package/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.js +59 -70
- package/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.js.map +1 -1
- package/features/file/CreateFilesInBatch/abstractions.js +3 -14
- package/features/file/CreateFilesInBatch/abstractions.js.map +1 -1
- package/features/file/CreateFilesInBatch/events.js +17 -26
- package/features/file/CreateFilesInBatch/events.js.map +1 -1
- package/features/file/CreateFilesInBatch/feature.js +7 -6
- package/features/file/CreateFilesInBatch/feature.js.map +1 -1
- package/features/file/CreateFilesInBatch/index.js +0 -2
- package/features/file/DeleteFile/DeleteFileRepository.js +21 -20
- package/features/file/DeleteFile/DeleteFileRepository.js.map +1 -1
- package/features/file/DeleteFile/DeleteFileUseCase.js +31 -33
- package/features/file/DeleteFile/DeleteFileUseCase.js.map +1 -1
- package/features/file/DeleteFile/abstractions.js +3 -14
- package/features/file/DeleteFile/abstractions.js.map +1 -1
- package/features/file/DeleteFile/events.js +17 -26
- package/features/file/DeleteFile/events.js.map +1 -1
- package/features/file/DeleteFile/feature.js +7 -6
- package/features/file/DeleteFile/feature.js.map +1 -1
- package/features/file/DeleteFile/index.js +1 -3
- package/features/file/FileUrlGenerator/abstractions.js +2 -2
- package/features/file/FileUrlGenerator/abstractions.js.map +1 -1
- package/features/file/GetFile/GetFileRepository.js +22 -22
- package/features/file/GetFile/GetFileRepository.js.map +1 -1
- package/features/file/GetFile/GetFileUseCase.js +19 -21
- package/features/file/GetFile/GetFileUseCase.js.map +1 -1
- package/features/file/GetFile/abstractions.js +3 -14
- package/features/file/GetFile/abstractions.js.map +1 -1
- package/features/file/GetFile/feature.js +7 -6
- package/features/file/GetFile/feature.js.map +1 -1
- package/features/file/GetFile/index.js +0 -2
- package/features/file/GetFileContentsById/abstractions.d.ts +20 -0
- package/features/file/GetFileContentsById/abstractions.js +5 -0
- package/features/file/GetFileContentsById/abstractions.js.map +1 -0
- package/features/file/GetFileContentsById/index.d.ts +1 -0
- package/features/file/GetFileContentsById/index.js +1 -0
- package/features/file/GetFileContentsByKey/abstractions.d.ts +17 -0
- package/features/file/GetFileContentsByKey/abstractions.js +5 -0
- package/features/file/GetFileContentsByKey/abstractions.js.map +1 -0
- package/features/file/GetFileContentsByKey/index.d.ts +1 -0
- package/features/file/GetFileContentsByKey/index.js +1 -0
- package/features/file/ListFiles/ListFilesRepository.js +42 -40
- package/features/file/ListFiles/ListFilesRepository.js.map +1 -1
- package/features/file/ListFiles/ListFilesUseCase.js +33 -34
- package/features/file/ListFiles/ListFilesUseCase.js.map +1 -1
- package/features/file/ListFiles/abstractions.js +3 -14
- package/features/file/ListFiles/abstractions.js.map +1 -1
- package/features/file/ListFiles/feature.js +7 -6
- package/features/file/ListFiles/feature.js.map +1 -1
- package/features/file/ListFiles/index.js +0 -2
- package/features/file/ListImagesByTagTool/ListImagesByTagTool.js +31 -28
- package/features/file/ListImagesByTagTool/ListImagesByTagTool.js.map +1 -1
- package/features/file/ListImagesByTagTool/feature.js +6 -5
- package/features/file/ListImagesByTagTool/feature.js.map +1 -1
- package/features/file/ListTags/ListTagsRepository.js +31 -36
- package/features/file/ListTags/ListTagsRepository.js.map +1 -1
- package/features/file/ListTags/ListTagsUseCase.js +21 -21
- package/features/file/ListTags/ListTagsUseCase.js.map +1 -1
- package/features/file/ListTags/abstractions.js +3 -14
- package/features/file/ListTags/abstractions.js.map +1 -1
- package/features/file/ListTags/feature.js +7 -6
- package/features/file/ListTags/feature.js.map +1 -1
- package/features/file/ListTags/index.js +0 -2
- package/features/file/UpdateFile/UpdateFileRepository.js +26 -28
- package/features/file/UpdateFile/UpdateFileRepository.js.map +1 -1
- package/features/file/UpdateFile/UpdateFileUseCase.js +57 -65
- package/features/file/UpdateFile/UpdateFileUseCase.js.map +1 -1
- package/features/file/UpdateFile/abstractions.js +3 -14
- package/features/file/UpdateFile/abstractions.js.map +1 -1
- package/features/file/UpdateFile/events.js +17 -26
- package/features/file/UpdateFile/events.js.map +1 -1
- package/features/file/UpdateFile/feature.js +7 -6
- package/features/file/UpdateFile/feature.js.map +1 -1
- package/features/file/UpdateFile/index.js +1 -3
- package/features/file/shared/EntryToFileMapper.js +25 -24
- package/features/file/shared/EntryToFileMapper.js.map +1 -1
- package/features/file/shared/FileInputToEntryInputMapper.js +29 -28
- package/features/file/shared/FileInputToEntryInputMapper.js.map +1 -1
- package/features/file/shared/FileToEntryMapper.js +28 -27
- package/features/file/shared/FileToEntryMapper.js.map +1 -1
- package/features/permissions/abstractions.js +2 -1
- package/features/permissions/abstractions.js.map +1 -1
- package/features/permissions/feature.js +2 -1
- package/features/permissions/feature.js.map +1 -1
- package/features/settings/GetSettings/GetSettingsUseCase.js +19 -19
- package/features/settings/GetSettings/GetSettingsUseCase.js.map +1 -1
- package/features/settings/GetSettings/abstractions.js +2 -7
- package/features/settings/GetSettings/abstractions.js.map +1 -1
- package/features/settings/GetSettings/feature.js +6 -5
- package/features/settings/GetSettings/feature.js.map +1 -1
- package/features/settings/SettingsInstaller/SettingsInstaller.js +25 -24
- package/features/settings/SettingsInstaller/SettingsInstaller.js.map +1 -1
- package/features/settings/SettingsInstaller/feature.js +6 -5
- package/features/settings/SettingsInstaller/feature.js.map +1 -1
- package/features/settings/UpdateSettings/UpdateSettingsUseCase.js +41 -48
- package/features/settings/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
- package/features/settings/UpdateSettings/abstractions.js +2 -7
- package/features/settings/UpdateSettings/abstractions.js.map +1 -1
- package/features/settings/UpdateSettings/events.js +17 -26
- package/features/settings/UpdateSettings/events.js.map +1 -1
- package/features/settings/UpdateSettings/feature.js +6 -5
- package/features/settings/UpdateSettings/feature.js.map +1 -1
- package/features/settings/UpdateSettings/index.js +0 -2
- package/features/shared/abstractions.js +0 -2
- package/graphql/baseSchema.js +30 -33
- package/graphql/baseSchema.js.map +1 -1
- package/graphql/createFilesTypeDefs.js +49 -57
- package/graphql/createFilesTypeDefs.js.map +1 -1
- package/graphql/filesSchema.js +79 -99
- package/graphql/filesSchema.js.map +1 -1
- package/graphql/getFileByUrl.js +45 -53
- package/graphql/getFileByUrl.js.map +1 -1
- package/graphql/index.js +35 -42
- package/graphql/index.js.map +1 -1
- package/graphql/utils.js +9 -14
- package/graphql/utils.js.map +1 -1
- package/index.d.ts +2 -2
- package/index.js +25 -30
- package/index.js.map +1 -1
- package/modelModifier/CmsModelModifier.js +40 -43
- package/modelModifier/CmsModelModifier.js.map +1 -1
- package/package.json +18 -21
- package/types.js +0 -2
- package/delivery/AssetDelivery/abstractions/AssetContentsReader.js.map +0 -1
- package/delivery/AssetDelivery/abstractions/AssetOutputStrategy.js.map +0 -1
- package/delivery/AssetDelivery/abstractions/AssetProcessor.js.map +0 -1
- package/delivery/AssetDelivery/abstractions/AssetRequestResolver.js.map +0 -1
- package/delivery/AssetDelivery/abstractions/AssetResolver.js.map +0 -1
- package/delivery/AssetDelivery/abstractions/AssetTransformationStrategy.js.map +0 -1
- package/delivery/AssetDelivery/privateFiles/AssetAuthorizer.js.map +0 -1
- package/delivery/index.js.map +0 -1
- package/domain/file/types.js.map +0 -1
- package/domain/settings/types.js.map +0 -1
- package/exports/api/file-manager/file.js.map +0 -1
- package/exports/api/file-manager/permissions.js.map +0 -1
- package/exports/api/file-manager/settings.js.map +0 -1
- package/features/ai/AiImageEnrichmentAfterCreateHandler.d.ts +0 -11
- package/features/ai/AiImageEnrichmentAfterCreateHandler.js +0 -28
- package/features/ai/AiImageEnrichmentAfterCreateHandler.js.map +0 -1
- package/features/ai/AiImageEnrichmentFeature.d.ts +0 -4
- package/features/ai/AiImageEnrichmentFeature.js +0 -12
- package/features/ai/AiImageEnrichmentFeature.js.map +0 -1
- package/features/file/CreateFile/index.js.map +0 -1
- package/features/file/CreateFilesInBatch/index.js.map +0 -1
- package/features/file/DeleteFile/index.js.map +0 -1
- package/features/file/GetFile/index.js.map +0 -1
- package/features/file/ListFiles/index.js.map +0 -1
- package/features/file/ListTags/index.js.map +0 -1
- package/features/file/UpdateFile/index.js.map +0 -1
- package/features/settings/UpdateSettings/index.js.map +0 -1
- package/features/shared/abstractions.js.map +0 -1
- package/tasks/AiImageEnrichmentTask.d.ts +0 -35
- package/tasks/AiImageEnrichmentTask.js +0 -136
- package/tasks/AiImageEnrichmentTask.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1,84 +1,73 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
|
-
import {
|
|
2
|
+
import { CreateFilesInBatchRepository, CreateFilesInBatchUseCase } from "./abstractions.js";
|
|
3
3
|
import { GetSettingsUseCase } from "../../settings/GetSettings/abstractions.js";
|
|
4
4
|
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
5
|
import { FileNotAuthorizedError, InvalidFileSizeError } from "../../../domain/file/errors.js";
|
|
6
|
-
import {
|
|
6
|
+
import { FileAfterBatchCreateEvent, FileBeforeBatchCreateEvent } from "./events.js";
|
|
7
7
|
import { FmPermissions } from "../../shared/abstractions.js";
|
|
8
8
|
class CreateFilesInBatchUseCaseImpl {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
async execute(input) {
|
|
16
|
-
const hasPermission = await this.permissions.canCreate("file");
|
|
17
|
-
if (!hasPermission) {
|
|
18
|
-
return Result.fail(new FileNotAuthorizedError());
|
|
9
|
+
constructor(permissions, repository, getSettings, eventPublisher){
|
|
10
|
+
this.permissions = permissions;
|
|
11
|
+
this.repository = repository;
|
|
12
|
+
this.getSettings = getSettings;
|
|
13
|
+
this.eventPublisher = eventPublisher;
|
|
19
14
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
await this.eventPublisher.publish(new FileAfterBatchCreateEvent({
|
|
53
|
-
files: result.value,
|
|
54
|
-
meta: input.meta
|
|
55
|
-
}));
|
|
56
|
-
return Result.ok(result.value);
|
|
57
|
-
}
|
|
58
|
-
async validateInput(files) {
|
|
59
|
-
const settingsResult = await this.getSettings.execute();
|
|
60
|
-
if (settingsResult.isFail()) {
|
|
61
|
-
return Result.ok();
|
|
15
|
+
async execute(input) {
|
|
16
|
+
const hasPermission = await this.permissions.canCreate("file");
|
|
17
|
+
if (!hasPermission) return Result.fail(new FileNotAuthorizedError());
|
|
18
|
+
const validationResult = await this.validateInput(input.files);
|
|
19
|
+
if (validationResult.isFail()) return Result.fail(validationResult.error);
|
|
20
|
+
const fileInputs = input.files.map((file)=>{
|
|
21
|
+
const [id] = file.key.split("/");
|
|
22
|
+
return {
|
|
23
|
+
id: file.id || id,
|
|
24
|
+
key: file.key,
|
|
25
|
+
name: file.name,
|
|
26
|
+
size: file.size,
|
|
27
|
+
type: file.type,
|
|
28
|
+
metadata: file.metadata || {},
|
|
29
|
+
location: file.location || {
|
|
30
|
+
folderId: "root"
|
|
31
|
+
},
|
|
32
|
+
tags: file.tags || [],
|
|
33
|
+
extensions: input.meta || {}
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
await this.eventPublisher.publish(new FileBeforeBatchCreateEvent({
|
|
37
|
+
files: fileInputs,
|
|
38
|
+
meta: input.meta
|
|
39
|
+
}));
|
|
40
|
+
const result = await this.repository.createBatch(fileInputs);
|
|
41
|
+
if (result.isFail()) return Result.fail(result.error);
|
|
42
|
+
await this.eventPublisher.publish(new FileAfterBatchCreateEvent({
|
|
43
|
+
files: result.value,
|
|
44
|
+
meta: input.meta
|
|
45
|
+
}));
|
|
46
|
+
return Result.ok(result.value);
|
|
62
47
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
48
|
+
async validateInput(files) {
|
|
49
|
+
const settingsResult = await this.getSettings.execute();
|
|
50
|
+
if (settingsResult.isFail()) return Result.ok();
|
|
51
|
+
const settings = settingsResult.value;
|
|
52
|
+
if (settings) {
|
|
53
|
+
for (const input of files)if (input.size < settings.uploadMinFileSize || input.size > settings.uploadMaxFileSize) return Result.fail(new InvalidFileSizeError({
|
|
54
|
+
size: input.size,
|
|
55
|
+
minSize: settings.uploadMinFileSize,
|
|
56
|
+
maxSize: settings.uploadMaxFileSize
|
|
57
|
+
}));
|
|
73
58
|
}
|
|
74
|
-
|
|
59
|
+
return Result.ok();
|
|
75
60
|
}
|
|
76
|
-
return Result.ok();
|
|
77
|
-
}
|
|
78
61
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
62
|
+
const CreateFilesInBatchUseCase_CreateFilesInBatchUseCase = CreateFilesInBatchUseCase.createImplementation({
|
|
63
|
+
implementation: CreateFilesInBatchUseCaseImpl,
|
|
64
|
+
dependencies: [
|
|
65
|
+
FmPermissions,
|
|
66
|
+
CreateFilesInBatchRepository,
|
|
67
|
+
GetSettingsUseCase,
|
|
68
|
+
EventPublisher
|
|
69
|
+
]
|
|
82
70
|
});
|
|
71
|
+
export { CreateFilesInBatchUseCase_CreateFilesInBatchUseCase as CreateFilesInBatchUseCase };
|
|
83
72
|
|
|
84
73
|
//# sourceMappingURL=CreateFilesInBatchUseCase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.js","sources":["../../../../src/features/file/CreateFilesInBatch/CreateFilesInBatchUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n CreateFilesInBatchUseCase as UseCaseAbstraction,\n CreateFilesInBatchInput,\n CreateFilesInBatchRepository\n} from \"./abstractions.js\";\nimport { GetSettingsUseCase } from \"../../settings/GetSettings/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport { FileNotAuthorizedError, InvalidFileSizeError } from \"~/domain/file/errors.js\";\nimport { FileBeforeBatchCreateEvent, FileAfterBatchCreateEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\nimport { CreateFileInput } from \"~/features/file/CreateFile/abstractions.js\";\n\nclass CreateFilesInBatchUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private permissions: FmPermissions.Interface,\n private repository: CreateFilesInBatchRepository.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n public async execute(\n input: CreateFilesInBatchInput\n ): Promise<Result<File[], UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canCreate(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Validate all files\n const validationResult = await this.validateInput(input.files);\n if (validationResult.isFail()) {\n return Result.fail(validationResult.error);\n }\n\n // Prepare file inputs with defaults\n const fileInputs: FileInput[] = input.files.map(file => {\n const [id] = file.key.split(\"/\");\n return {\n id: file.id || id,\n key: file.key,\n name: file.name,\n size: file.size,\n type: file.type,\n metadata: file.metadata || {},\n location: file.location || { folderId: \"root\" },\n tags: file.tags || [],\n extensions: input.meta || {}\n };\n });\n\n await this.eventPublisher.publish(\n new FileBeforeBatchCreateEvent({ files: fileInputs, meta: input.meta })\n );\n\n const result = await this.repository.createBatch(fileInputs);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new FileAfterBatchCreateEvent({ files: result.value, meta: input.meta })\n );\n\n return Result.ok(result.value);\n }\n\n private async validateInput(\n files: CreateFileInput[]\n ): Promise<Result<void, InvalidFileSizeError>> {\n const settingsResult = await this.getSettings.execute();\n\n if (settingsResult.isFail()) {\n return Result.ok();\n }\n\n const settings = settingsResult.value;\n\n if (settings) {\n for (const input of files) {\n // Validate file size\n if (\n input.size < settings.uploadMinFileSize ||\n input.size > settings.uploadMaxFileSize\n ) {\n return Result.fail(\n new InvalidFileSizeError({\n size: input.size,\n minSize: settings.uploadMinFileSize,\n maxSize: settings.uploadMaxFileSize\n })\n );\n }\n }\n }\n\n return Result.ok();\n }\n}\n\nexport const CreateFilesInBatchUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateFilesInBatchUseCaseImpl,\n dependencies: [FmPermissions, CreateFilesInBatchRepository, GetSettingsUseCase, EventPublisher]\n});\n"],"names":["CreateFilesInBatchUseCaseImpl","permissions","repository","getSettings","eventPublisher","input","hasPermission","Result","FileNotAuthorizedError","validationResult","fileInputs","file","id","FileBeforeBatchCreateEvent","result","FileAfterBatchCreateEvent","files","settingsResult","settings","InvalidFileSizeError","CreateFilesInBatchUseCase","UseCaseAbstraction","FmPermissions","CreateFilesInBatchRepository","GetSettingsUseCase","EventPublisher"],"mappings":";;;;;;;AAcA,MAAMA;IACF,YACYC,WAAoC,EACpCC,UAAkD,EAClDC,WAAyC,EACzCC,cAAwC,CAClD;aAJUH,WAAW,GAAXA;aACAC,UAAU,GAAVA;aACAC,WAAW,GAAXA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAa,QACTC,KAA8B,EACmB;QACjD,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QACvD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAI3B,MAAMC,mBAAmB,MAAM,IAAI,CAAC,aAAa,CAACJ,MAAM,KAAK;QAC7D,IAAII,iBAAiB,MAAM,IACvB,OAAOF,OAAO,IAAI,CAACE,iBAAiB,KAAK;QAI7C,MAAMC,aAA0BL,MAAM,KAAK,CAAC,GAAG,CAACM,CAAAA;YAC5C,MAAM,CAACC,GAAG,GAAGD,KAAK,GAAG,CAAC,KAAK,CAAC;YAC5B,OAAO;gBACH,IAAIA,KAAK,EAAE,IAAIC;gBACf,KAAKD,KAAK,GAAG;gBACb,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,MAAMA,KAAK,IAAI;gBACf,UAAUA,KAAK,QAAQ,IAAI,CAAC;gBAC5B,UAAUA,KAAK,QAAQ,IAAI;oBAAE,UAAU;gBAAO;gBAC9C,MAAMA,KAAK,IAAI,IAAI,EAAE;gBACrB,YAAYN,MAAM,IAAI,IAAI,CAAC;YAC/B;QACJ;QAEA,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIQ,2BAA2B;YAAE,OAAOH;YAAY,MAAML,MAAM,IAAI;QAAC;QAGzE,MAAMS,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAACJ;QAEjD,IAAII,OAAO,MAAM,IACb,OAAOP,OAAO,IAAI,CAACO,OAAO,KAAK;QAGnC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIC,0BAA0B;YAAE,OAAOD,OAAO,KAAK;YAAE,MAAMT,MAAM,IAAI;QAAC;QAG1E,OAAOE,OAAO,EAAE,CAACO,OAAO,KAAK;IACjC;IAEA,MAAc,cACVE,KAAwB,EACmB;QAC3C,MAAMC,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QAErD,IAAIA,eAAe,MAAM,IACrB,OAAOV,OAAO,EAAE;QAGpB,MAAMW,WAAWD,eAAe,KAAK;QAErC,IAAIC,UACA;YAAA,KAAK,MAAMb,SAASW,MAEhB,IACIX,MAAM,IAAI,GAAGa,SAAS,iBAAiB,IACvCb,MAAM,IAAI,GAAGa,SAAS,iBAAiB,EAEvC,OAAOX,OAAO,IAAI,CACd,IAAIY,qBAAqB;gBACrB,MAAMd,MAAM,IAAI;gBAChB,SAASa,SAAS,iBAAiB;gBACnC,SAASA,SAAS,iBAAiB;YACvC;QAGZ;QAGJ,OAAOX,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMa,sDAA4BC,0BAAAA,oBAAuC,CAAC;IAC7E,gBAAgBrB;IAChB,cAAc;QAACsB;QAAeC;QAA8BC;QAAoBC;KAAe;AACnG"}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/** Persist multiple files created in batch. */
|
|
8
|
-
export const CreateFilesInBatchRepository = createAbstraction("CreateFilesInBatchRepository");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* CreateFilesInBatch use case interface
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/** Upload and create multiple files in batch. */
|
|
15
|
-
export const CreateFilesInBatchUseCase = createAbstraction("CreateFilesInBatchUseCase");
|
|
2
|
+
const CreateFilesInBatchRepository = createAbstraction("CreateFilesInBatchRepository");
|
|
3
|
+
const CreateFilesInBatchUseCase = createAbstraction("CreateFilesInBatchUseCase");
|
|
4
|
+
export { CreateFilesInBatchRepository, CreateFilesInBatchUseCase };
|
|
16
5
|
|
|
17
6
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/CreateFilesInBatch/abstractions.js","sources":["../../../../src/features/file/CreateFilesInBatch/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\nimport {\n type FilePersistenceError,\n type InvalidFileSizeError,\n FileNotAuthorizedError\n} from \"~/domain/file/errors.js\";\n\nexport interface CreateFilesInBatchInput {\n files: FileInput[];\n meta?: Record<string, any>;\n}\n\n/**\n * CreateFilesInBatch repository interface\n */\nexport interface ICreateFilesInBatchRepository {\n createBatch(files: FileInput[]): Promise<Result<File[], RepositoryError>>;\n}\n\nexport interface ICreateFilesInBatchRepositoryErrors {\n persistence: FilePersistenceError;\n}\n\ntype RepositoryError =\n ICreateFilesInBatchRepositoryErrors[keyof ICreateFilesInBatchRepositoryErrors];\n\n/** Persist multiple files created in batch. */\nexport const CreateFilesInBatchRepository = createAbstraction<ICreateFilesInBatchRepository>(\n \"CreateFilesInBatchRepository\"\n);\n\nexport namespace CreateFilesInBatchRepository {\n export type Interface = ICreateFilesInBatchRepository;\n export type Error = RepositoryError;\n}\n\n/**\n * CreateFilesInBatch use case interface\n */\nexport interface ICreateFilesInBatchUseCase {\n execute(input: CreateFilesInBatchInput): Promise<Result<File[], UseCaseError>>;\n}\n\nexport interface ICreateFilesInBatchUseCaseErrors {\n notAuthorized: FileNotAuthorizedError;\n persistence: FilePersistenceError;\n invalidSize: InvalidFileSizeError;\n}\n\ntype UseCaseError = ICreateFilesInBatchUseCaseErrors[keyof ICreateFilesInBatchUseCaseErrors];\n\n/** Upload and create multiple files in batch. */\nexport const CreateFilesInBatchUseCase = createAbstraction<ICreateFilesInBatchUseCase>(\n \"CreateFilesInBatchUseCase\"\n);\n\nexport namespace CreateFilesInBatchUseCase {\n export type Interface = ICreateFilesInBatchUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["CreateFilesInBatchRepository","createAbstraction","CreateFilesInBatchUseCase"],"mappings":";AA6BO,MAAMA,+BAA+BC,kBACxC;AAwBG,MAAMC,4BAA4BD,kBACrC"}
|
|
@@ -1,32 +1,23 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
2
|
import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
getHandlerAbstraction() {
|
|
11
|
-
return FileBeforeBatchCreateEventHandler;
|
|
12
|
-
}
|
|
3
|
+
class FileBeforeBatchCreateEvent extends DomainEvent {
|
|
4
|
+
getHandlerAbstraction() {
|
|
5
|
+
return FileBeforeBatchCreateEventHandler;
|
|
6
|
+
}
|
|
7
|
+
constructor(...args){
|
|
8
|
+
super(...args), this.eventType = "FileManager/File/BeforeBatchCreate";
|
|
9
|
+
}
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export class FileAfterBatchCreateEvent extends DomainEvent {
|
|
23
|
-
eventType = "FileManager/File/AfterBatchCreate";
|
|
24
|
-
getHandlerAbstraction() {
|
|
25
|
-
return FileAfterBatchCreateEventHandler;
|
|
26
|
-
}
|
|
11
|
+
const FileBeforeBatchCreateEventHandler = createAbstraction("FileBeforeBatchCreateEventHandler");
|
|
12
|
+
class FileAfterBatchCreateEvent extends DomainEvent {
|
|
13
|
+
getHandlerAbstraction() {
|
|
14
|
+
return FileAfterBatchCreateEventHandler;
|
|
15
|
+
}
|
|
16
|
+
constructor(...args){
|
|
17
|
+
super(...args), this.eventType = "FileManager/File/AfterBatchCreate";
|
|
18
|
+
}
|
|
27
19
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export const FileAfterBatchCreateEventHandler = createAbstraction("FileAfterBatchCreateEventHandler");
|
|
20
|
+
const FileAfterBatchCreateEventHandler = createAbstraction("FileAfterBatchCreateEventHandler");
|
|
21
|
+
export { FileAfterBatchCreateEvent, FileAfterBatchCreateEventHandler, FileBeforeBatchCreateEvent, FileBeforeBatchCreateEventHandler };
|
|
31
22
|
|
|
32
23
|
//# sourceMappingURL=events.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/CreateFilesInBatch/events.js","sources":["../../../../src/features/file/CreateFilesInBatch/events.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { File, FileInput } from \"~/domain/file/types.js\";\n\n// ============================================================================\n// FileBeforeBatchCreate Event\n// ============================================================================\n\nexport interface FileBeforeBatchCreatePayload {\n files: FileInput[];\n meta?: Record<string, any>;\n}\n\nexport class FileBeforeBatchCreateEvent extends DomainEvent<FileBeforeBatchCreatePayload> {\n eventType = \"FileManager/File/BeforeBatchCreate\" as const;\n\n getHandlerAbstraction() {\n return FileBeforeBatchCreateEventHandler;\n }\n}\n\n/** Hook into file lifecycle before files are created in batch. */\nexport const FileBeforeBatchCreateEventHandler = createAbstraction<\n IEventHandler<FileBeforeBatchCreateEvent>\n>(\"FileBeforeBatchCreateEventHandler\");\n\nexport namespace FileBeforeBatchCreateEventHandler {\n export type Interface = IEventHandler<FileBeforeBatchCreateEvent>;\n export type Event = FileBeforeBatchCreateEvent;\n}\n\n// ============================================================================\n// FileAfterBatchCreate Event\n// ============================================================================\n\nexport interface FileAfterBatchCreatePayload {\n files: File[];\n meta?: Record<string, any>;\n}\n\nexport class FileAfterBatchCreateEvent extends DomainEvent<FileAfterBatchCreatePayload> {\n eventType = \"FileManager/File/AfterBatchCreate\" as const;\n\n getHandlerAbstraction() {\n return FileAfterBatchCreateEventHandler;\n }\n}\n\n/** Hook into file lifecycle after files are created in batch. */\nexport const FileAfterBatchCreateEventHandler = createAbstraction<\n IEventHandler<FileAfterBatchCreateEvent>\n>(\"FileAfterBatchCreateEventHandler\");\n\nexport namespace FileAfterBatchCreateEventHandler {\n export type Interface = IEventHandler<FileAfterBatchCreateEvent>;\n export type Event = FileAfterBatchCreateEvent;\n}\n"],"names":["FileBeforeBatchCreateEvent","DomainEvent","FileBeforeBatchCreateEventHandler","createAbstraction","FileAfterBatchCreateEvent","FileAfterBatchCreateEventHandler"],"mappings":";;AAcO,MAAMA,mCAAmCC;IAG5C,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAGO,MAAMA,oCAAoCC,kBAE/C;AAgBK,MAAMC,kCAAkCH;IAG3C,wBAAwB;QACpB,OAAOI;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAGO,MAAMA,mCAAmCF,kBAE9C"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import { CreateFilesInBatchRepository } from "./CreateFilesInBatchRepository.js";
|
|
3
3
|
import { CreateFilesInBatchUseCase } from "./CreateFilesInBatchUseCase.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
const CreateFilesInBatchFeature = createFeature({
|
|
5
|
+
name: "FileManager/CreateFilesInBatch",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(CreateFilesInBatchUseCase);
|
|
8
|
+
container.register(CreateFilesInBatchRepository).inSingletonScope();
|
|
9
|
+
}
|
|
10
10
|
});
|
|
11
|
+
export { CreateFilesInBatchFeature };
|
|
11
12
|
|
|
12
13
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/CreateFilesInBatch/feature.js","sources":["../../../../src/features/file/CreateFilesInBatch/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CreateFilesInBatchRepository } from \"./CreateFilesInBatchRepository.js\";\nimport { CreateFilesInBatchUseCase } from \"./CreateFilesInBatchUseCase.js\";\n\nexport const CreateFilesInBatchFeature = createFeature({\n name: \"FileManager/CreateFilesInBatch\",\n register(container) {\n container.register(CreateFilesInBatchUseCase);\n container.register(CreateFilesInBatchRepository).inSingletonScope();\n }\n});\n"],"names":["CreateFilesInBatchFeature","createFeature","container","CreateFilesInBatchUseCase","CreateFilesInBatchRepository"],"mappings":";;;AAIO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE,8BAA8B,gBAAgB;IACrE;AACJ"}
|
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
2
|
import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry";
|
|
3
|
-
import { DeleteFileRepository
|
|
3
|
+
import { DeleteFileRepository } from "./abstractions.js";
|
|
4
4
|
import { FileModel } from "../../../domain/file/abstractions.js";
|
|
5
5
|
import { FileNotFoundError, FilePersistenceError } from "../../../domain/file/errors.js";
|
|
6
6
|
class DeleteFileRepositoryImpl {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return Result.fail(new FilePersistenceError(result.error));
|
|
7
|
+
constructor(deleteEntry, fileModel){
|
|
8
|
+
this.deleteEntry = deleteEntry;
|
|
9
|
+
this.fileModel = fileModel;
|
|
10
|
+
}
|
|
11
|
+
async delete(file) {
|
|
12
|
+
const entryId = `${file.id}#0001`;
|
|
13
|
+
const result = await this.deleteEntry.execute(this.fileModel, entryId);
|
|
14
|
+
if (result.isFail()) {
|
|
15
|
+
const error = result.error;
|
|
16
|
+
if ("Cms/Entry/NotFound" === error.code) return Result.fail(new FileNotFoundError(file.id));
|
|
17
|
+
return Result.fail(new FilePersistenceError(result.error));
|
|
18
|
+
}
|
|
19
|
+
return Result.ok();
|
|
21
20
|
}
|
|
22
|
-
return Result.ok();
|
|
23
|
-
}
|
|
24
21
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
const DeleteFileRepository_DeleteFileRepository = DeleteFileRepository.createImplementation({
|
|
23
|
+
implementation: DeleteFileRepositoryImpl,
|
|
24
|
+
dependencies: [
|
|
25
|
+
DeleteEntryUseCase,
|
|
26
|
+
FileModel
|
|
27
|
+
]
|
|
28
28
|
});
|
|
29
|
+
export { DeleteFileRepository_DeleteFileRepository as DeleteFileRepository };
|
|
29
30
|
|
|
30
31
|
//# sourceMappingURL=DeleteFileRepository.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/DeleteFile/DeleteFileRepository.js","sources":["../../../../src/features/file/DeleteFile/DeleteFileRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { DeleteFileRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { FileModel } from \"~/domain/file/abstractions.js\";\nimport { FileNotFoundError, FilePersistenceError } from \"~/domain/file/errors.js\";\nimport { File } from \"~/domain/file/types.js\";\n\nclass DeleteFileRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private deleteEntry: DeleteEntryUseCase.Interface,\n private fileModel: FileModel.Interface\n ) {}\n\n async delete(file: File): Promise<Result<void, RepositoryAbstraction.Error>> {\n // Files are not versioned, so we're always deleting the same revision\n const entryId = `${file.id}#0001`;\n\n const result = await this.deleteEntry.execute(this.fileModel, entryId);\n\n if (result.isFail()) {\n const error = result.error;\n if (error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new FileNotFoundError(file.id));\n }\n return Result.fail(new FilePersistenceError(result.error));\n }\n\n return Result.ok();\n }\n}\n\nexport const DeleteFileRepository = RepositoryAbstraction.createImplementation({\n implementation: DeleteFileRepositoryImpl,\n dependencies: [DeleteEntryUseCase, FileModel]\n});\n"],"names":["DeleteFileRepositoryImpl","deleteEntry","fileModel","file","entryId","result","error","Result","FileNotFoundError","FilePersistenceError","DeleteFileRepository","RepositoryAbstraction","DeleteEntryUseCase","FileModel"],"mappings":";;;;;AAOA,MAAMA;IACF,YACYC,WAAyC,EACzCC,SAA8B,CACxC;aAFUD,WAAW,GAAXA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,OAAOC,IAAU,EAAsD;QAEzE,MAAMC,UAAU,GAAGD,KAAK,EAAE,CAAC,KAAK,CAAC;QAEjC,MAAME,SAAS,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAED;QAE9D,IAAIC,OAAO,MAAM,IAAI;YACjB,MAAMC,QAAQD,OAAO,KAAK;YAC1B,IAAIC,AAAe,yBAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,kBAAkBL,KAAK,EAAE;YAEpD,OAAOI,OAAO,IAAI,CAAC,IAAIE,qBAAqBJ,OAAO,KAAK;QAC5D;QAEA,OAAOE,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMG,4CAAuBC,qBAAAA,oBAA0C,CAAC;IAC3E,gBAAgBX;IAChB,cAAc;QAACY;QAAoBC;KAAU;AACjD"}
|
|
@@ -1,45 +1,43 @@
|
|
|
1
1
|
import { Result } from "@webiny/feature/api";
|
|
2
|
-
import {
|
|
2
|
+
import { DeleteFileRepository, DeleteFileUseCase } from "./abstractions.js";
|
|
3
3
|
import { GetFileUseCase } from "../GetFile/abstractions.js";
|
|
4
4
|
import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
5
5
|
import { FileNotAuthorizedError } from "../../../domain/file/errors.js";
|
|
6
|
-
import {
|
|
6
|
+
import { FileAfterDeleteEvent, FileBeforeDeleteEvent } from "./events.js";
|
|
7
7
|
import { FmPermissions } from "../../shared/abstractions.js";
|
|
8
8
|
class DeleteFileUseCaseImpl {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
async execute(id) {
|
|
16
|
-
const hasPermission = await this.permissions.canDelete("file");
|
|
17
|
-
if (!hasPermission) {
|
|
18
|
-
return Result.fail(new FileNotAuthorizedError());
|
|
9
|
+
constructor(permissions, getFile, repository, eventPublisher){
|
|
10
|
+
this.permissions = permissions;
|
|
11
|
+
this.getFile = getFile;
|
|
12
|
+
this.repository = repository;
|
|
13
|
+
this.eventPublisher = eventPublisher;
|
|
19
14
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
15
|
+
async execute(id) {
|
|
16
|
+
const hasPermission = await this.permissions.canDelete("file");
|
|
17
|
+
if (!hasPermission) return Result.fail(new FileNotAuthorizedError());
|
|
18
|
+
const getResult = await this.getFile.execute(id);
|
|
19
|
+
if (getResult.isFail()) return Result.fail(getResult.error);
|
|
20
|
+
const file = getResult.value;
|
|
21
|
+
await this.eventPublisher.publish(new FileBeforeDeleteEvent({
|
|
22
|
+
file
|
|
23
|
+
}));
|
|
24
|
+
const result = await this.repository.delete(file);
|
|
25
|
+
if (result.isFail()) return Result.fail(result.error);
|
|
26
|
+
await this.eventPublisher.publish(new FileAfterDeleteEvent({
|
|
27
|
+
file
|
|
28
|
+
}));
|
|
29
|
+
return Result.ok();
|
|
33
30
|
}
|
|
34
|
-
await this.eventPublisher.publish(new FileAfterDeleteEvent({
|
|
35
|
-
file
|
|
36
|
-
}));
|
|
37
|
-
return Result.ok();
|
|
38
|
-
}
|
|
39
31
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
32
|
+
const DeleteFileUseCase_DeleteFileUseCase = DeleteFileUseCase.createImplementation({
|
|
33
|
+
implementation: DeleteFileUseCaseImpl,
|
|
34
|
+
dependencies: [
|
|
35
|
+
FmPermissions,
|
|
36
|
+
GetFileUseCase,
|
|
37
|
+
DeleteFileRepository,
|
|
38
|
+
EventPublisher
|
|
39
|
+
]
|
|
43
40
|
});
|
|
41
|
+
export { DeleteFileUseCase_DeleteFileUseCase as DeleteFileUseCase };
|
|
44
42
|
|
|
45
43
|
//# sourceMappingURL=DeleteFileUseCase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/DeleteFile/DeleteFileUseCase.js","sources":["../../../../src/features/file/DeleteFile/DeleteFileUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { DeleteFileUseCase as UseCaseAbstraction, DeleteFileRepository } from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../GetFile/abstractions.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport { FileNotAuthorizedError } from \"~/domain/file/errors.js\";\nimport { FileBeforeDeleteEvent, FileAfterDeleteEvent } from \"./events.js\";\nimport { FmPermissions } from \"~/features/shared/abstractions.js\";\n\nclass DeleteFileUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private permissions: FmPermissions.Interface,\n private getFile: GetFileUseCase.Interface,\n private repository: DeleteFileRepository.Interface,\n private eventPublisher: EventPublisher.Interface\n ) {}\n\n async execute(id: string): Promise<Result<void, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canDelete(\"file\");\n if (!hasPermission) {\n return Result.fail(new FileNotAuthorizedError());\n }\n\n // Get file (includes ownership check)\n const getResult = await this.getFile.execute(id);\n if (getResult.isFail()) {\n return Result.fail(getResult.error);\n }\n\n const file = getResult.value;\n\n await this.eventPublisher.publish(new FileBeforeDeleteEvent({ file }));\n\n const result = await this.repository.delete(file);\n\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(new FileAfterDeleteEvent({ file }));\n\n return Result.ok();\n }\n}\n\nexport const DeleteFileUseCase = UseCaseAbstraction.createImplementation({\n implementation: DeleteFileUseCaseImpl,\n dependencies: [FmPermissions, GetFileUseCase, DeleteFileRepository, EventPublisher]\n});\n"],"names":["DeleteFileUseCaseImpl","permissions","getFile","repository","eventPublisher","id","hasPermission","Result","FileNotAuthorizedError","getResult","file","FileBeforeDeleteEvent","result","FileAfterDeleteEvent","DeleteFileUseCase","UseCaseAbstraction","FmPermissions","GetFileUseCase","DeleteFileRepository","EventPublisher"],"mappings":";;;;;;;AAQA,MAAMA;IACF,YACYC,WAAoC,EACpCC,OAAiC,EACjCC,UAA0C,EAC1CC,cAAwC,CAClD;aAJUH,WAAW,GAAXA;aACAC,OAAO,GAAPA;aACAC,UAAU,GAAVA;aACAC,cAAc,GAAdA;IACT;IAEH,MAAM,QAAQC,EAAU,EAAmD;QACvE,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;QACvD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAI3B,MAAMC,YAAY,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACJ;QAC7C,IAAII,UAAU,MAAM,IAChB,OAAOF,OAAO,IAAI,CAACE,UAAU,KAAK;QAGtC,MAAMC,OAAOD,UAAU,KAAK;QAE5B,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,sBAAsB;YAAED;QAAK;QAEnE,MAAME,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAACF;QAE5C,IAAIE,OAAO,MAAM,IACb,OAAOL,OAAO,IAAI,CAACK,OAAO,KAAK;QAGnC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIC,qBAAqB;YAAEH;QAAK;QAElE,OAAOH,OAAO,EAAE;IACpB;AACJ;AAEO,MAAMO,sCAAoBC,kBAAAA,oBAAuC,CAAC;IACrE,gBAAgBf;IAChB,cAAc;QAACgB;QAAeC;QAAgBC;QAAsBC;KAAe;AACvF"}
|
|
@@ -1,17 +1,6 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
/** Persist file deletion. */
|
|
8
|
-
export const DeleteFileRepository = createAbstraction("DeleteFileRepository");
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* DeleteFile use case interface
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
/** Delete a file. */
|
|
15
|
-
export const DeleteFileUseCase = createAbstraction("DeleteFileUseCase");
|
|
2
|
+
const DeleteFileRepository = createAbstraction("DeleteFileRepository");
|
|
3
|
+
const DeleteFileUseCase = createAbstraction("DeleteFileUseCase");
|
|
4
|
+
export { DeleteFileRepository, DeleteFileUseCase };
|
|
16
5
|
|
|
17
6
|
//# sourceMappingURL=abstractions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/file/DeleteFile/abstractions.js","sources":["../../../../src/features/file/DeleteFile/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport {\n type FilePersistenceError,\n type FileNotFoundError,\n FileNotAuthorizedError\n} from \"~/domain/file/errors.js\";\nimport { File } from \"~/domain/file/types.js\";\n\n/**\n * DeleteFile repository interface\n */\nexport interface IDeleteFileRepository {\n delete(file: File): Promise<Result<void, RepositoryError>>;\n}\n\nexport interface IDeleteFileRepositoryErrors {\n notFound: FileNotFoundError;\n persistence: FilePersistenceError;\n}\n\ntype RepositoryError = IDeleteFileRepositoryErrors[keyof IDeleteFileRepositoryErrors];\n\n/** Persist file deletion. */\nexport const DeleteFileRepository =\n createAbstraction<IDeleteFileRepository>(\"DeleteFileRepository\");\n\nexport namespace DeleteFileRepository {\n export type Interface = IDeleteFileRepository;\n export type Error = RepositoryError;\n}\n\n/**\n * DeleteFile use case interface\n */\nexport interface IDeleteFileUseCase {\n execute(id: string): Promise<Result<void, UseCaseError>>;\n}\n\nexport interface IDeleteFileUseCaseErrors {\n notAuthorized: FileNotAuthorizedError;\n notFound: FileNotFoundError;\n persistence: FilePersistenceError;\n}\n\ntype UseCaseError = IDeleteFileUseCaseErrors[keyof IDeleteFileUseCaseErrors];\n\n/** Delete a file. */\nexport const DeleteFileUseCase = createAbstraction<IDeleteFileUseCase>(\"DeleteFileUseCase\");\n\nexport namespace DeleteFileUseCase {\n export type Interface = IDeleteFileUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["DeleteFileRepository","createAbstraction","DeleteFileUseCase"],"mappings":";AAwBO,MAAMA,uBACTC,kBAAyC;AAuBtC,MAAMC,oBAAoBD,kBAAsC"}
|
|
@@ -1,32 +1,23 @@
|
|
|
1
1
|
import { createAbstraction } from "@webiny/feature/api";
|
|
2
2
|
import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
getHandlerAbstraction() {
|
|
11
|
-
return FileBeforeDeleteEventHandler;
|
|
12
|
-
}
|
|
3
|
+
class FileBeforeDeleteEvent extends DomainEvent {
|
|
4
|
+
getHandlerAbstraction() {
|
|
5
|
+
return FileBeforeDeleteEventHandler;
|
|
6
|
+
}
|
|
7
|
+
constructor(...args){
|
|
8
|
+
super(...args), this.eventType = "FileManager/File/BeforeDelete";
|
|
9
|
+
}
|
|
13
10
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
export class FileAfterDeleteEvent extends DomainEvent {
|
|
23
|
-
eventType = "FileManager/File/AfterDelete";
|
|
24
|
-
getHandlerAbstraction() {
|
|
25
|
-
return FileAfterDeleteEventHandler;
|
|
26
|
-
}
|
|
11
|
+
const FileBeforeDeleteEventHandler = createAbstraction("FileBeforeDeleteEventHandler");
|
|
12
|
+
class FileAfterDeleteEvent extends DomainEvent {
|
|
13
|
+
getHandlerAbstraction() {
|
|
14
|
+
return FileAfterDeleteEventHandler;
|
|
15
|
+
}
|
|
16
|
+
constructor(...args){
|
|
17
|
+
super(...args), this.eventType = "FileManager/File/AfterDelete";
|
|
18
|
+
}
|
|
27
19
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
export const FileAfterDeleteEventHandler = createAbstraction("FileAfterDeleteEventHandler");
|
|
20
|
+
const FileAfterDeleteEventHandler = createAbstraction("FileAfterDeleteEventHandler");
|
|
21
|
+
export { FileAfterDeleteEvent, FileAfterDeleteEventHandler, FileBeforeDeleteEvent, FileBeforeDeleteEventHandler };
|
|
31
22
|
|
|
32
23
|
//# sourceMappingURL=events.js.map
|