@webiny/api-file-manager 5.34.8-beta.1 → 5.35.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/createFileManager/checkBasePermissions.d.ts +5 -0
  2. package/createFileManager/checkBasePermissions.js +24 -0
  3. package/createFileManager/checkBasePermissions.js.map +1 -0
  4. package/createFileManager/files.crud.d.ts +3 -0
  5. package/createFileManager/files.crud.js +318 -0
  6. package/createFileManager/files.crud.js.map +1 -0
  7. package/createFileManager/filevalidation.disabled.d.ts +0 -0
  8. package/createFileManager/filevalidation.disabled.js +55 -0
  9. package/createFileManager/filevalidation.disabled.js.map +1 -0
  10. package/createFileManager/index.d.ts +13 -0
  11. package/createFileManager/index.js +20 -0
  12. package/createFileManager/index.js.map +1 -0
  13. package/createFileManager/settings.crud.d.ts +3 -0
  14. package/createFileManager/settings.crud.js +91 -0
  15. package/createFileManager/settings.crud.js.map +1 -0
  16. package/createFileManager/system.crud.d.ts +3 -0
  17. package/createFileManager/system.crud.js +86 -0
  18. package/createFileManager/system.crud.js.map +1 -0
  19. package/graphql/index.d.ts +3 -0
  20. package/graphql/index.js +288 -0
  21. package/graphql/index.js.map +1 -0
  22. package/handlers/download/byAlias.d.ts +6 -0
  23. package/handlers/download/byAlias.js +89 -0
  24. package/handlers/download/byAlias.js.map +1 -0
  25. package/handlers/download/byExactKey.d.ts +2 -0
  26. package/handlers/download/byExactKey.js +57 -0
  27. package/handlers/download/byExactKey.js.map +1 -0
  28. package/handlers/download/extractFileInformation.d.ts +9 -0
  29. package/handlers/download/extractFileInformation.js +20 -0
  30. package/handlers/download/extractFileInformation.js.map +1 -0
  31. package/handlers/download/getS3Object.d.ts +10 -0
  32. package/handlers/download/getS3Object.js +57 -0
  33. package/handlers/download/getS3Object.js.map +1 -0
  34. package/handlers/download/index.d.ts +2 -3
  35. package/handlers/download/index.js +21 -126
  36. package/handlers/download/index.js.map +1 -1
  37. package/handlers/manage/index.js +0 -16
  38. package/handlers/manage/index.js.map +1 -1
  39. package/handlers/transform/index.js +12 -19
  40. package/handlers/transform/index.js.map +1 -1
  41. package/handlers/transform/legacyUtils.d.ts +17 -0
  42. package/handlers/transform/legacyUtils.js +42 -0
  43. package/handlers/transform/legacyUtils.js.map +1 -0
  44. package/handlers/transform/loaders/imageLoader.d.ts +1 -1
  45. package/handlers/transform/loaders/imageLoader.js +12 -23
  46. package/handlers/transform/loaders/imageLoader.js.map +1 -1
  47. package/handlers/transform/loaders/index.d.ts +1 -1
  48. package/handlers/transform/loaders/index.js +0 -3
  49. package/handlers/transform/loaders/index.js.map +1 -1
  50. package/handlers/transform/loaders/sanitizeImageTransformations.js +0 -13
  51. package/handlers/transform/loaders/sanitizeImageTransformations.js.map +1 -1
  52. package/handlers/transform/managers/imageManager.js +32 -21
  53. package/handlers/transform/managers/imageManager.js.map +1 -1
  54. package/handlers/transform/managers/index.js +0 -3
  55. package/handlers/transform/managers/index.js.map +1 -1
  56. package/handlers/transform/optimizeImage.js +0 -6
  57. package/handlers/transform/optimizeImage.js.map +1 -1
  58. package/handlers/transform/transformImage.js +0 -5
  59. package/handlers/transform/transformImage.js.map +1 -1
  60. package/handlers/transform/utils.d.ts +1 -1
  61. package/handlers/transform/utils.js +7 -17
  62. package/handlers/transform/utils.js.map +1 -1
  63. package/handlers/utils/getEnvironment.js +0 -2
  64. package/handlers/utils/getEnvironment.js.map +1 -1
  65. package/handlers/utils/getObjectParams.js +0 -4
  66. package/handlers/utils/getObjectParams.js.map +1 -1
  67. package/handlers/utils/index.js +0 -3
  68. package/handlers/utils/index.js.map +1 -1
  69. package/index.d.ts +6 -0
  70. package/index.js +68 -0
  71. package/index.js.map +1 -0
  72. package/package.json +21 -23
  73. package/plugins/FilePhysicalStoragePlugin.d.ts +21 -0
  74. package/plugins/FilePhysicalStoragePlugin.js +31 -0
  75. package/plugins/FilePhysicalStoragePlugin.js.map +1 -0
  76. package/plugins/FileStorageTransformPlugin.d.ts +34 -0
  77. package/plugins/FileStorageTransformPlugin.js +40 -0
  78. package/plugins/FileStorageTransformPlugin.js.map +1 -0
  79. package/plugins/graphql.js +3 -3
  80. package/plugins/graphql.js.map +1 -1
  81. package/plugins/index.d.ts +2 -2
  82. package/plugins/index.js +22 -19
  83. package/plugins/index.js.map +1 -1
  84. package/storage/FileStorage.d.ts +32 -0
  85. package/storage/FileStorage.js +86 -0
  86. package/storage/FileStorage.js.map +1 -0
  87. package/types/file.d.ts +33 -0
  88. package/types/file.js +5 -0
  89. package/types/file.js.map +1 -0
  90. package/types/file.lifecycle.d.ts +40 -0
  91. package/types/file.lifecycle.js +5 -0
  92. package/types/file.lifecycle.js.map +1 -0
  93. package/types.d.ts +44 -45
  94. package/types.js +22 -0
  95. package/types.js.map +1 -1
@@ -0,0 +1,5 @@
1
+ import { GetPermission } from "@webiny/api-security/types";
2
+ import { FilePermission } from "../types";
3
+ export declare const checkBasePermissions: (getPermission: GetPermission, check?: {
4
+ rwd?: string;
5
+ }) => Promise<FilePermission>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.checkBasePermissions = void 0;
7
+ var _apiSecurity = require("@webiny/api-security");
8
+ const checkBasePermissions = async (getPermission, check = {}) => {
9
+ const filePermission = await getPermission("fm.file");
10
+ if (!filePermission) {
11
+ throw new _apiSecurity.NotAuthorizedError();
12
+ }
13
+ if (check.rwd && !hasRwd(filePermission, check.rwd)) {
14
+ throw new _apiSecurity.NotAuthorizedError();
15
+ }
16
+ return filePermission;
17
+ };
18
+ exports.checkBasePermissions = checkBasePermissions;
19
+ const hasRwd = (filesFilePermission, rwd) => {
20
+ if (typeof filesFilePermission.rwd !== "string") {
21
+ return true;
22
+ }
23
+ return filesFilePermission.rwd.includes(rwd);
24
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"names":["checkBasePermissions","getPermission","check","filePermission","NotAuthorizedError","rwd","hasRwd","filesFilePermission","includes"],"sources":["checkBasePermissions.ts"],"sourcesContent":["import { NotAuthorizedError } from \"@webiny/api-security\";\nimport { GetPermission } from \"@webiny/api-security/types\";\nimport { FilePermission } from \"~/types\";\n\nexport const checkBasePermissions = async (\n getPermission: GetPermission,\n check: { rwd?: string } = {}\n): Promise<FilePermission> => {\n const filePermission = await getPermission<FilePermission>(\"fm.file\");\n\n if (!filePermission) {\n throw new NotAuthorizedError();\n }\n if (check.rwd && !hasRwd(filePermission, check.rwd)) {\n throw new NotAuthorizedError();\n }\n\n return filePermission;\n};\n\nconst hasRwd = (filesFilePermission: FilePermission, rwd: string): boolean => {\n if (typeof filesFilePermission.rwd !== \"string\") {\n return true;\n }\n\n return filesFilePermission.rwd.includes(rwd);\n};\n"],"mappings":";;;;;;AAAA;AAIO,MAAMA,oBAAoB,GAAG,OAChCC,aAA4B,EAC5BC,KAAuB,GAAG,CAAC,CAAC,KACF;EAC1B,MAAMC,cAAc,GAAG,MAAMF,aAAa,CAAiB,SAAS,CAAC;EAErE,IAAI,CAACE,cAAc,EAAE;IACjB,MAAM,IAAIC,+BAAkB,EAAE;EAClC;EACA,IAAIF,KAAK,CAACG,GAAG,IAAI,CAACC,MAAM,CAACH,cAAc,EAAED,KAAK,CAACG,GAAG,CAAC,EAAE;IACjD,MAAM,IAAID,+BAAkB,EAAE;EAClC;EAEA,OAAOD,cAAc;AACzB,CAAC;AAAC;AAEF,MAAMG,MAAM,GAAG,CAACC,mBAAmC,EAAEF,GAAW,KAAc;EAC1E,IAAI,OAAOE,mBAAmB,CAACF,GAAG,KAAK,QAAQ,EAAE;IAC7C,OAAO,IAAI;EACf;EAEA,OAAOE,mBAAmB,CAACF,GAAG,CAACG,QAAQ,CAACH,GAAG,CAAC;AAChD,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { FilesCRUD } from "../types";
2
+ import { FileManagerConfig } from "./index";
3
+ export declare const createFilesCrud: (config: FileManagerConfig) => FilesCRUD;
@@ -0,0 +1,318 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createFilesCrud = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _handlerGraphql = require("@webiny/handler-graphql");
10
+ var _apiSecurity = require("@webiny/api-security");
11
+ var _pubsub = require("@webiny/pubsub");
12
+ var _error = _interopRequireDefault(require("@webiny/error"));
13
+ var _checkBasePermissions = require("./checkBasePermissions");
14
+ /**
15
+ * If permission is limited to "own" files only, check that current identity owns the file.
16
+ */
17
+ const checkOwnership = (file, permission, identity) => {
18
+ if ((permission === null || permission === void 0 ? void 0 : permission.own) === true) {
19
+ if (file.createdBy.id !== identity.id) {
20
+ throw new _apiSecurity.NotAuthorizedError();
21
+ }
22
+ }
23
+ };
24
+ const createFilesCrud = config => {
25
+ const {
26
+ storageOperations,
27
+ getLocaleCode,
28
+ getTenantId,
29
+ getIdentity,
30
+ getPermission,
31
+ WEBINY_VERSION
32
+ } = config;
33
+ return {
34
+ onFileBeforeCreate: (0, _pubsub.createTopic)("fileManager.onFileBeforeCreate"),
35
+ onFileAfterCreate: (0, _pubsub.createTopic)("fileManager.onFileAfterCreate"),
36
+ onFileBeforeBatchCreate: (0, _pubsub.createTopic)("fileManager.onFileBeforeBatchCreate"),
37
+ onFileAfterBatchCreate: (0, _pubsub.createTopic)("fileManager.onFileAfterBatchCreate"),
38
+ onFileBeforeUpdate: (0, _pubsub.createTopic)("fileManager.onFileBeforeUpdate"),
39
+ onFileAfterUpdate: (0, _pubsub.createTopic)("fileManager.onFileAfterUpdate"),
40
+ onFileBeforeDelete: (0, _pubsub.createTopic)("fileManager.onFileBeforeDelete"),
41
+ onFileAfterDelete: (0, _pubsub.createTopic)("fileManager.onFileAfterDelete"),
42
+ async getFile(id) {
43
+ const permission = await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
44
+ rwd: "r"
45
+ });
46
+ const file = await storageOperations.files.get({
47
+ where: {
48
+ id,
49
+ tenant: getTenantId(),
50
+ locale: getLocaleCode()
51
+ }
52
+ });
53
+ if (!file) {
54
+ throw new _handlerGraphql.NotFoundError(`File with id "${id}" does not exists.`);
55
+ }
56
+ checkOwnership(file, permission, getIdentity());
57
+ return file;
58
+ },
59
+ async createFile(input) {
60
+ await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
61
+ rwd: "w"
62
+ });
63
+ const identity = getIdentity();
64
+
65
+ // Extract ID from file key
66
+ const [id] = input.key.split("/");
67
+ const file = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, input), {}, {
68
+ tags: Array.isArray(input.tags) ? input.tags : [],
69
+ aliases: Array.isArray(input.aliases) ? input.aliases : [],
70
+ id: input.id || id,
71
+ meta: (0, _objectSpread2.default)({
72
+ private: false
73
+ }, input.meta || {}),
74
+ tenant: getTenantId(),
75
+ createdOn: new Date().toISOString(),
76
+ createdBy: {
77
+ id: identity.id,
78
+ displayName: identity.displayName,
79
+ type: identity.type
80
+ },
81
+ locale: getLocaleCode(),
82
+ webinyVersion: WEBINY_VERSION
83
+ });
84
+ try {
85
+ await this.onFileBeforeCreate.publish({
86
+ file
87
+ });
88
+ const result = await storageOperations.files.create({
89
+ file
90
+ });
91
+ await this.onFileAfterCreate.publish({
92
+ file
93
+ });
94
+ return result;
95
+ } catch (ex) {
96
+ throw new _error.default(ex.message || "Could not create a file.", ex.code || "CREATE_FILE_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
97
+ file
98
+ }));
99
+ }
100
+ },
101
+ async updateFile(id, input) {
102
+ const permission = await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
103
+ rwd: "w"
104
+ });
105
+ const original = await storageOperations.files.get({
106
+ where: {
107
+ id,
108
+ tenant: getTenantId(),
109
+ locale: getLocaleCode()
110
+ }
111
+ });
112
+ if (!original) {
113
+ throw new _handlerGraphql.NotFoundError(`File with id "${id}" does not exists.`);
114
+ }
115
+ checkOwnership(original, permission, getIdentity());
116
+ const file = (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, original), input), {}, {
117
+ tags: Array.isArray(input.tags) ? input.tags : Array.isArray(original.tags) ? original.tags : [],
118
+ aliases: Array.isArray(input.aliases) ? input.aliases : Array.isArray(original.aliases) ? original.aliases : [],
119
+ id: original.id,
120
+ webinyVersion: WEBINY_VERSION
121
+ });
122
+ try {
123
+ await this.onFileBeforeUpdate.publish({
124
+ original,
125
+ file,
126
+ input
127
+ });
128
+ const result = await storageOperations.files.update({
129
+ original,
130
+ file
131
+ });
132
+ await this.onFileAfterUpdate.publish({
133
+ original,
134
+ file,
135
+ input
136
+ });
137
+ return result;
138
+ } catch (ex) {
139
+ throw new _error.default(ex.message || "Could not update a file.", ex.code || "UPDATE_FILE_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
140
+ original,
141
+ file
142
+ }));
143
+ }
144
+ },
145
+ async deleteFile(id) {
146
+ const permission = await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
147
+ rwd: "d"
148
+ });
149
+ const file = await storageOperations.files.get({
150
+ where: {
151
+ id,
152
+ tenant: getTenantId(),
153
+ locale: getLocaleCode()
154
+ }
155
+ });
156
+ if (!file) {
157
+ throw new _handlerGraphql.NotFoundError(`File with id "${id}" does not exists.`);
158
+ }
159
+ checkOwnership(file, permission, getIdentity());
160
+ try {
161
+ await this.onFileBeforeDelete.publish({
162
+ file
163
+ });
164
+ await storageOperations.files.delete({
165
+ file
166
+ });
167
+ await this.onFileAfterDelete.publish({
168
+ file
169
+ });
170
+ } catch (ex) {
171
+ throw new _error.default(ex.message || "Could not delete a file.", ex.code || "DELETE_FILE_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
172
+ id,
173
+ file
174
+ }));
175
+ }
176
+ return true;
177
+ },
178
+ async createFilesInBatch(inputs) {
179
+ await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
180
+ rwd: "w"
181
+ });
182
+ const identity = getIdentity();
183
+ const tenant = getTenantId();
184
+ const locale = getLocaleCode();
185
+ const createdBy = {
186
+ id: identity.id,
187
+ displayName: identity.displayName,
188
+ type: identity.type
189
+ };
190
+ const files = inputs.map(input => {
191
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, input), {}, {
192
+ tags: Array.isArray(input.tags) ? input.tags : [],
193
+ aliases: Array.isArray(input.aliases) ? input.aliases : [],
194
+ meta: (0, _objectSpread2.default)({
195
+ private: false
196
+ }, input.meta || {}),
197
+ tenant,
198
+ createdOn: new Date().toISOString(),
199
+ createdBy,
200
+ locale,
201
+ webinyVersion: WEBINY_VERSION
202
+ });
203
+ });
204
+ try {
205
+ await this.onFileBeforeBatchCreate.publish({
206
+ files
207
+ });
208
+ const results = await storageOperations.files.createBatch({
209
+ files
210
+ });
211
+ await this.onFileAfterBatchCreate.publish({
212
+ files
213
+ });
214
+ return results;
215
+ } catch (ex) {
216
+ throw new _error.default(ex.message || "Could not create a batch of files.", ex.code || "CREATE_FILES_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
217
+ files
218
+ }));
219
+ }
220
+ },
221
+ async listFiles(params = {}) {
222
+ const permission = await (0, _checkBasePermissions.checkBasePermissions)(getPermission, {
223
+ rwd: "r"
224
+ });
225
+ const {
226
+ limit = 40,
227
+ search = "",
228
+ types = [],
229
+ tags = [],
230
+ ids = [],
231
+ after = null,
232
+ where: initialWhere,
233
+ sort: initialSort
234
+ } = params;
235
+ const where = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialWhere), {}, {
236
+ private: false,
237
+ locale: getLocaleCode(),
238
+ tenant: getTenantId()
239
+ });
240
+ /**
241
+ * Always override the createdBy received from the user, if any.
242
+ */
243
+ if (permission.own === true) {
244
+ const identity = getIdentity();
245
+ where.createdBy = identity.id;
246
+ }
247
+ /**
248
+ * We need to map the old GraphQL definition to the new one.
249
+ * That GQL definition is marked as deprecated.
250
+ */
251
+ /**
252
+ * To have standardized where objects across the applications, we transform the types into type_in.
253
+ */
254
+ if (Array.isArray(types) && types.length > 0 && !where.type_in) {
255
+ where.type_in = types;
256
+ }
257
+ /**
258
+ * We are assigning search to tag and name search.
259
+ * This should be treated as OR condition in the storage operations.
260
+ */
261
+ if (search && !where.search) {
262
+ where.search = search;
263
+ }
264
+ /**
265
+ * Same as on types/type_in.
266
+ */
267
+ if (Array.isArray(tags) && tags.length > 0 && !where.tag_in) {
268
+ where.tag_in = tags.map(tag => tag.toLowerCase());
269
+ }
270
+ /**
271
+ * Same as on types/type_in.
272
+ */
273
+ if (Array.isArray(ids) && ids.length > 0 && !where.id_in) {
274
+ where.id_in = ids;
275
+ }
276
+ const sort = Array.isArray(initialSort) && initialSort.length > 0 ? initialSort : ["id_DESC"];
277
+ try {
278
+ return await storageOperations.files.list({
279
+ where,
280
+ after,
281
+ limit,
282
+ sort
283
+ });
284
+ } catch (ex) {
285
+ throw new _error.default(ex.message || "Could not list files by given parameters.", ex.code || "FILE_TAG_SEARCH_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
286
+ where,
287
+ after,
288
+ limit,
289
+ sort
290
+ }));
291
+ }
292
+ },
293
+ async listTags({
294
+ where: initialWhere,
295
+ after,
296
+ limit
297
+ }) {
298
+ await (0, _checkBasePermissions.checkBasePermissions)(getPermission);
299
+ const where = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, initialWhere), {}, {
300
+ tenant: getTenantId(),
301
+ locale: getLocaleCode()
302
+ });
303
+ const params = {
304
+ where,
305
+ limit: limit || 1000000,
306
+ after
307
+ };
308
+ try {
309
+ return await storageOperations.files.tags(params);
310
+ } catch (ex) {
311
+ throw new _error.default(ex.message || "Could not search for tags.", ex.code || "FILE_TAG_SEARCH_ERROR", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, ex.data || {}), {}, {
312
+ params
313
+ }));
314
+ }
315
+ }
316
+ };
317
+ };
318
+ exports.createFilesCrud = createFilesCrud;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["checkOwnership","file","permission","identity","own","createdBy","id","NotAuthorizedError","createFilesCrud","config","storageOperations","getLocaleCode","getTenantId","getIdentity","getPermission","WEBINY_VERSION","onFileBeforeCreate","createTopic","onFileAfterCreate","onFileBeforeBatchCreate","onFileAfterBatchCreate","onFileBeforeUpdate","onFileAfterUpdate","onFileBeforeDelete","onFileAfterDelete","getFile","checkBasePermissions","rwd","files","get","where","tenant","locale","NotFoundError","createFile","input","key","split","tags","Array","isArray","aliases","meta","private","createdOn","Date","toISOString","displayName","type","webinyVersion","publish","result","create","ex","WebinyError","message","code","data","updateFile","original","update","deleteFile","delete","createFilesInBatch","inputs","map","results","createBatch","listFiles","params","limit","search","types","ids","after","initialWhere","sort","initialSort","length","type_in","tag_in","tag","toLowerCase","id_in","list","listTags"],"sources":["files.crud.ts"],"sourcesContent":["import { NotFoundError } from \"@webiny/handler-graphql\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\nimport { createTopic } from \"@webiny/pubsub\";\nimport WebinyError from \"@webiny/error\";\nimport { SecurityIdentity } from \"@webiny/api-security/types\";\nimport {\n CreatedBy,\n File,\n FileManagerFilesStorageOperationsListParamsWhere,\n FileManagerFilesStorageOperationsTagsParamsWhere,\n FilePermission,\n FilesCRUD,\n FilesListOpts\n} from \"~/types\";\nimport { checkBasePermissions } from \"./checkBasePermissions\";\nimport { FileManagerConfig } from \"~/createFileManager/index\";\n\n/**\n * If permission is limited to \"own\" files only, check that current identity owns the file.\n */\nconst checkOwnership = (file: File, permission: FilePermission, identity: SecurityIdentity) => {\n if (permission?.own === true) {\n if (file.createdBy.id !== identity.id) {\n throw new NotAuthorizedError();\n }\n }\n};\n\nexport const createFilesCrud = (config: FileManagerConfig): FilesCRUD => {\n const {\n storageOperations,\n getLocaleCode,\n getTenantId,\n getIdentity,\n getPermission,\n WEBINY_VERSION\n } = config;\n\n return {\n onFileBeforeCreate: createTopic(\"fileManager.onFileBeforeCreate\"),\n onFileAfterCreate: createTopic(\"fileManager.onFileAfterCreate\"),\n onFileBeforeBatchCreate: createTopic(\"fileManager.onFileBeforeBatchCreate\"),\n onFileAfterBatchCreate: createTopic(\"fileManager.onFileAfterBatchCreate\"),\n onFileBeforeUpdate: createTopic(\"fileManager.onFileBeforeUpdate\"),\n onFileAfterUpdate: createTopic(\"fileManager.onFileAfterUpdate\"),\n onFileBeforeDelete: createTopic(\"fileManager.onFileBeforeDelete\"),\n onFileAfterDelete: createTopic(\"fileManager.onFileAfterDelete\"),\n async getFile(id: string) {\n const permission = await checkBasePermissions(getPermission, { rwd: \"r\" });\n\n const file = await storageOperations.files.get({\n where: {\n id,\n tenant: getTenantId(),\n locale: getLocaleCode()\n }\n });\n\n if (!file) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(file, permission, getIdentity());\n\n return file;\n },\n async createFile(input) {\n await checkBasePermissions(getPermission, { rwd: \"w\" });\n const identity = getIdentity();\n\n // Extract ID from file key\n const [id] = input.key.split(\"/\");\n\n const file: File = {\n ...input,\n tags: Array.isArray(input.tags) ? input.tags : [],\n aliases: Array.isArray(input.aliases) ? input.aliases : [],\n id: input.id || id,\n meta: {\n private: false,\n ...(input.meta || {})\n },\n tenant: getTenantId(),\n createdOn: new Date().toISOString(),\n createdBy: {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n },\n locale: getLocaleCode(),\n webinyVersion: WEBINY_VERSION\n };\n\n try {\n await this.onFileBeforeCreate.publish({ file });\n\n const result = await storageOperations.files.create({ file });\n\n await this.onFileAfterCreate.publish({ file });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create a file.\",\n ex.code || \"CREATE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n file\n }\n );\n }\n },\n async updateFile(id, input) {\n const permission = await checkBasePermissions(getPermission, { rwd: \"w\" });\n\n const original = await storageOperations.files.get({\n where: {\n id,\n tenant: getTenantId(),\n locale: getLocaleCode()\n }\n });\n\n if (!original) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(original, permission, getIdentity());\n\n const file: File = {\n ...original,\n ...input,\n tags: Array.isArray(input.tags)\n ? input.tags\n : Array.isArray(original.tags)\n ? original.tags\n : [],\n aliases: Array.isArray(input.aliases)\n ? input.aliases\n : Array.isArray(original.aliases)\n ? original.aliases\n : [],\n id: original.id,\n webinyVersion: WEBINY_VERSION\n };\n\n try {\n await this.onFileBeforeUpdate.publish({\n original,\n file,\n input\n });\n\n const result = await storageOperations.files.update({\n original,\n file\n });\n\n await this.onFileAfterUpdate.publish({\n original,\n file,\n input\n });\n return result;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not update a file.\",\n ex.code || \"UPDATE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n original,\n file\n }\n );\n }\n },\n async deleteFile(id) {\n const permission = await checkBasePermissions(getPermission, { rwd: \"d\" });\n\n const file = await storageOperations.files.get({\n where: {\n id,\n tenant: getTenantId(),\n locale: getLocaleCode()\n }\n });\n\n if (!file) {\n throw new NotFoundError(`File with id \"${id}\" does not exists.`);\n }\n\n checkOwnership(file, permission, getIdentity());\n\n try {\n await this.onFileBeforeDelete.publish({ file });\n\n await storageOperations.files.delete({\n file\n });\n\n await this.onFileAfterDelete.publish({ file });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not delete a file.\",\n ex.code || \"DELETE_FILE_ERROR\",\n {\n ...(ex.data || {}),\n id,\n file\n }\n );\n }\n\n return true;\n },\n async createFilesInBatch(inputs) {\n await checkBasePermissions(getPermission, { rwd: \"w\" });\n\n const identity = getIdentity();\n const tenant = getTenantId();\n const locale = getLocaleCode();\n\n const createdBy: CreatedBy = {\n id: identity.id,\n displayName: identity.displayName,\n type: identity.type\n };\n\n const files: File[] = inputs.map(input => {\n return {\n ...input,\n tags: Array.isArray(input.tags) ? input.tags : [],\n aliases: Array.isArray(input.aliases) ? input.aliases : [],\n meta: {\n private: false,\n ...(input.meta || {})\n },\n tenant,\n createdOn: new Date().toISOString(),\n createdBy,\n locale,\n webinyVersion: WEBINY_VERSION\n };\n });\n\n try {\n await this.onFileBeforeBatchCreate.publish({ files });\n const results = await storageOperations.files.createBatch({\n files\n });\n await this.onFileAfterBatchCreate.publish({ files });\n return results;\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not create a batch of files.\",\n ex.code || \"CREATE_FILES_ERROR\",\n {\n ...(ex.data || {}),\n files\n }\n );\n }\n },\n async listFiles(params: FilesListOpts = {}) {\n const permission = await checkBasePermissions(getPermission, { rwd: \"r\" });\n\n const {\n limit = 40,\n search = \"\",\n types = [],\n tags = [],\n ids = [],\n after = null,\n where: initialWhere,\n sort: initialSort\n } = params;\n\n const where: FileManagerFilesStorageOperationsListParamsWhere = {\n ...initialWhere,\n private: false,\n locale: getLocaleCode(),\n tenant: getTenantId()\n };\n /**\n * Always override the createdBy received from the user, if any.\n */\n if (permission.own === true) {\n const identity = getIdentity();\n where.createdBy = identity.id;\n }\n /**\n * We need to map the old GraphQL definition to the new one.\n * That GQL definition is marked as deprecated.\n */\n /**\n * To have standardized where objects across the applications, we transform the types into type_in.\n */\n if (Array.isArray(types) && types.length > 0 && !where.type_in) {\n where.type_in = types;\n }\n /**\n * We are assigning search to tag and name search.\n * This should be treated as OR condition in the storage operations.\n */\n if (search && !where.search) {\n where.search = search;\n }\n /**\n * Same as on types/type_in.\n */\n if (Array.isArray(tags) && tags.length > 0 && !where.tag_in) {\n where.tag_in = tags.map(tag => tag.toLowerCase());\n }\n /**\n * Same as on types/type_in.\n */\n if (Array.isArray(ids) && ids.length > 0 && !where.id_in) {\n where.id_in = ids;\n }\n\n const sort =\n Array.isArray(initialSort) && initialSort.length > 0 ? initialSort : [\"id_DESC\"];\n try {\n return await storageOperations.files.list({\n where,\n after,\n limit,\n sort\n });\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not list files by given parameters.\",\n ex.code || \"FILE_TAG_SEARCH_ERROR\",\n {\n ...(ex.data || {}),\n where,\n after,\n limit,\n sort\n }\n );\n }\n },\n async listTags({ where: initialWhere, after, limit }) {\n await checkBasePermissions(getPermission);\n\n const where: FileManagerFilesStorageOperationsTagsParamsWhere = {\n ...initialWhere,\n tenant: getTenantId(),\n locale: getLocaleCode()\n };\n\n const params = {\n where,\n limit: limit || 1000000,\n after\n };\n\n try {\n return await storageOperations.files.tags(params);\n } catch (ex) {\n throw new WebinyError(\n ex.message || \"Could not search for tags.\",\n ex.code || \"FILE_TAG_SEARCH_ERROR\",\n {\n ...(ex.data || {}),\n params\n }\n );\n }\n }\n };\n};\n"],"mappings":"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"}
File without changes
@@ -0,0 +1,55 @@
1
+ // /**
2
+ // * Package @commodo/fields does not have types
3
+ // */
4
+ // // @ts-ignore
5
+ // import { withFields, string, number, onSet } from "@commodo/fields";
6
+ // /**
7
+ // * Package commodo-fields-object does not have types
8
+ // */
9
+ // // @ts-ignore
10
+ // import { object } from "commodo-fields-object";
11
+ // import { validation } from "@webiny/validation";
12
+ //
13
+ // export default (create = true) => {
14
+ // return withFields({
15
+ // key: string({
16
+ // validation: validation.create(`${create ? "required," : ""}maxLength:1000`)
17
+ // }),
18
+ // name: string({ validation: validation.create("maxLength:1000") }),
19
+ // size: number(),
20
+ // type: string({ validation: validation.create("maxLength:255") }),
21
+ // meta: object({ value: { private: false } }),
22
+ // tags: onSet((value: string[]) => {
23
+ // if (!Array.isArray(value)) {
24
+ // return null;
25
+ // }
26
+ //
27
+ // return value.map(item => item.toLowerCase());
28
+ // })(
29
+ // string({
30
+ // list: true,
31
+ // validation: (tags: string[]) => {
32
+ // if (!Array.isArray(tags)) {
33
+ // return;
34
+ // }
35
+ //
36
+ // if (tags.length > 15) {
37
+ // throw Error("You cannot set more than 15 tags.");
38
+ // }
39
+ //
40
+ // for (let i = 0; i < tags.length; i++) {
41
+ // const tag = tags[i];
42
+ // if (typeof tag !== "string") {
43
+ // throw Error("Tag must be typeof string.");
44
+ // }
45
+ //
46
+ // if (tag.length > 50) {
47
+ // throw Error(`Tag ${tag} is more than 50 characters long.`);
48
+ // }
49
+ // }
50
+ // }
51
+ // })
52
+ // )
53
+ // })();
54
+ // };
55
+ "use strict";
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["filevalidation.disabled.ts"],"sourcesContent":["// /**\n// * Package @commodo/fields does not have types\n// */\n// // @ts-ignore\n// import { withFields, string, number, onSet } from \"@commodo/fields\";\n// /**\n// * Package commodo-fields-object does not have types\n// */\n// // @ts-ignore\n// import { object } from \"commodo-fields-object\";\n// import { validation } from \"@webiny/validation\";\n//\n// export default (create = true) => {\n// return withFields({\n// key: string({\n// validation: validation.create(`${create ? \"required,\" : \"\"}maxLength:1000`)\n// }),\n// name: string({ validation: validation.create(\"maxLength:1000\") }),\n// size: number(),\n// type: string({ validation: validation.create(\"maxLength:255\") }),\n// meta: object({ value: { private: false } }),\n// tags: onSet((value: string[]) => {\n// if (!Array.isArray(value)) {\n// return null;\n// }\n//\n// return value.map(item => item.toLowerCase());\n// })(\n// string({\n// list: true,\n// validation: (tags: string[]) => {\n// if (!Array.isArray(tags)) {\n// return;\n// }\n//\n// if (tags.length > 15) {\n// throw Error(\"You cannot set more than 15 tags.\");\n// }\n//\n// for (let i = 0; i < tags.length; i++) {\n// const tag = tags[i];\n// if (typeof tag !== \"string\") {\n// throw Error(\"Tag must be typeof string.\");\n// }\n//\n// if (tag.length > 50) {\n// throw Error(`Tag ${tag} is more than 50 characters long.`);\n// }\n// }\n// }\n// })\n// )\n// })();\n// };\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA"}
@@ -0,0 +1,13 @@
1
+ import { FileManagerContextObject, FileManagerStorageOperations } from "../types";
2
+ import { GetPermission, SecurityIdentity } from "@webiny/api-security/types";
3
+ import { FileStorage } from "../storage/FileStorage";
4
+ export interface FileManagerConfig {
5
+ storageOperations: FileManagerStorageOperations;
6
+ getTenantId: () => string;
7
+ getLocaleCode: () => string;
8
+ getIdentity: () => SecurityIdentity;
9
+ getPermission: GetPermission;
10
+ storage: FileStorage;
11
+ WEBINY_VERSION: string;
12
+ }
13
+ export declare const createFileManager: (config: FileManagerConfig) => FileManagerContextObject;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createFileManager = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _files = require("./files.crud");
10
+ var _settings = require("./settings.crud");
11
+ var _system = require("./system.crud");
12
+ const createFileManager = config => {
13
+ const filesCrud = (0, _files.createFilesCrud)(config);
14
+ const settingsCrud = (0, _settings.createSettingsCrud)(config);
15
+ const systemCrud = (0, _system.createSystemCrud)(config);
16
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, filesCrud), settingsCrud), systemCrud), {}, {
17
+ storage: config.storage
18
+ });
19
+ };
20
+ exports.createFileManager = createFileManager;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFileManager","config","filesCrud","createFilesCrud","settingsCrud","createSettingsCrud","systemCrud","createSystemCrud","storage"],"sources":["index.ts"],"sourcesContent":["import { FileManagerContextObject, FileManagerStorageOperations } from \"~/types\";\nimport { GetPermission, SecurityIdentity } from \"@webiny/api-security/types\";\nimport { createFilesCrud } from \"~/createFileManager/files.crud\";\nimport { FileStorage } from \"~/storage/FileStorage\";\nimport { createSettingsCrud } from \"~/createFileManager/settings.crud\";\nimport { createSystemCrud } from \"~/createFileManager/system.crud\";\n\nexport interface FileManagerConfig {\n storageOperations: FileManagerStorageOperations;\n getTenantId: () => string;\n getLocaleCode: () => string;\n getIdentity: () => SecurityIdentity;\n getPermission: GetPermission;\n storage: FileStorage;\n WEBINY_VERSION: string;\n}\n\nexport const createFileManager = (config: FileManagerConfig): FileManagerContextObject => {\n const filesCrud = createFilesCrud(config);\n const settingsCrud = createSettingsCrud(config);\n const systemCrud = createSystemCrud(config);\n\n return {\n ...filesCrud,\n ...settingsCrud,\n ...systemCrud,\n storage: config.storage\n };\n};\n"],"mappings":";;;;;;;;AAEA;AAEA;AACA;AAYO,MAAMA,iBAAiB,GAAIC,MAAyB,IAA+B;EACtF,MAAMC,SAAS,GAAG,IAAAC,sBAAe,EAACF,MAAM,CAAC;EACzC,MAAMG,YAAY,GAAG,IAAAC,4BAAkB,EAACJ,MAAM,CAAC;EAC/C,MAAMK,UAAU,GAAG,IAAAC,wBAAgB,EAACN,MAAM,CAAC;EAE3C,2HACOC,SAAS,GACTE,YAAY,GACZE,UAAU;IACbE,OAAO,EAAEP,MAAM,CAACO;EAAO;AAE/B,CAAC;AAAC"}
@@ -0,0 +1,3 @@
1
+ import { SettingsCRUD } from "../types";
2
+ import { FileManagerConfig } from "./index";
3
+ export declare const createSettingsCrud: ({ storageOperations, getTenantId }: FileManagerConfig) => SettingsCRUD;
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createSettingsCrud = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _fields = require("@commodo/fields");
10
+ var _validation = require("@webiny/validation");
11
+ /**
12
+ * Package @commodo/fields does not have types.
13
+ */
14
+ // @ts-ignore
15
+
16
+ const CreateDataModel = (0, _fields.withFields)({
17
+ uploadMinFileSize: (0, _fields.number)({
18
+ value: 0,
19
+ validation: _validation.validation.create("gte:0")
20
+ }),
21
+ uploadMaxFileSize: (0, _fields.number)({
22
+ value: 26214401
23
+ }),
24
+ srcPrefix: (0, _fields.onSet)(value => {
25
+ // Make sure srcPrefix always ends with forward slash.
26
+ if (typeof value === "string") {
27
+ return value.endsWith("/") ? value : value + "/";
28
+ }
29
+ return value;
30
+ })((0, _fields.string)({
31
+ value: "/files/"
32
+ }))
33
+ })();
34
+ const UpdateDataModel = (0, _fields.withFields)({
35
+ uploadMinFileSize: (0, _fields.number)({
36
+ validation: _validation.validation.create("gte:0")
37
+ }),
38
+ uploadMaxFileSize: (0, _fields.number)(),
39
+ srcPrefix: (0, _fields.onSet)(value => {
40
+ // Make sure srcPrefix always ends with forward slash.
41
+ if (typeof value === "string") {
42
+ return value.endsWith("/") ? value : value + "/";
43
+ }
44
+ return value;
45
+ })((0, _fields.string)())
46
+ })();
47
+ const createSettingsCrud = ({
48
+ storageOperations,
49
+ getTenantId
50
+ }) => {
51
+ return {
52
+ async getSettings() {
53
+ return storageOperations.settings.get({
54
+ tenant: getTenantId()
55
+ });
56
+ },
57
+ async createSettings(data) {
58
+ const settings = new CreateDataModel().populate(data);
59
+ await settings.validate();
60
+ const settingsData = await settings.toJSON();
61
+ return storageOperations.settings.create({
62
+ data: (0, _objectSpread2.default)((0, _objectSpread2.default)({}, settingsData), {}, {
63
+ tenant: getTenantId()
64
+ })
65
+ });
66
+ },
67
+ async updateSettings(data) {
68
+ const updatedValue = new UpdateDataModel().populate(data);
69
+ await updatedValue.validate();
70
+ const existingSettings = await storageOperations.settings.get({
71
+ tenant: getTenantId()
72
+ });
73
+ const updatedSettings = await updatedValue.toJSON({
74
+ onlyDirty: true
75
+ });
76
+ return storageOperations.settings.update({
77
+ original: existingSettings,
78
+ data: (0, _objectSpread2.default)((0, _objectSpread2.default)((0, _objectSpread2.default)({}, existingSettings), updatedSettings), {}, {
79
+ tenant: getTenantId()
80
+ })
81
+ });
82
+ },
83
+ async deleteSettings() {
84
+ await storageOperations.settings.delete({
85
+ tenant: getTenantId()
86
+ });
87
+ return true;
88
+ }
89
+ };
90
+ };
91
+ exports.createSettingsCrud = createSettingsCrud;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CreateDataModel","withFields","uploadMinFileSize","number","value","validation","create","uploadMaxFileSize","srcPrefix","onSet","endsWith","string","UpdateDataModel","createSettingsCrud","storageOperations","getTenantId","getSettings","settings","get","tenant","createSettings","data","populate","validate","settingsData","toJSON","updateSettings","updatedValue","existingSettings","updatedSettings","onlyDirty","update","original","deleteSettings","delete"],"sources":["settings.crud.ts"],"sourcesContent":["/**\n * Package @commodo/fields does not have types.\n */\n// @ts-ignore\nimport { withFields, string, number, onSet } from \"@commodo/fields\";\nimport { validation } from \"@webiny/validation\";\nimport { FileManagerSettings, SettingsCRUD } from \"~/types\";\nimport { FileManagerConfig } from \"~/createFileManager/index\";\n\nconst CreateDataModel = withFields({\n uploadMinFileSize: number({ value: 0, validation: validation.create(\"gte:0\") }),\n uploadMaxFileSize: number({ value: 26214401 }),\n srcPrefix: onSet((value?: string) => {\n // Make sure srcPrefix always ends with forward slash.\n if (typeof value === \"string\") {\n return value.endsWith(\"/\") ? value : value + \"/\";\n }\n return value;\n })(string({ value: \"/files/\" }))\n})();\n\nconst UpdateDataModel = withFields({\n uploadMinFileSize: number({\n validation: validation.create(\"gte:0\")\n }),\n uploadMaxFileSize: number(),\n srcPrefix: onSet((value?: string) => {\n // Make sure srcPrefix always ends with forward slash.\n if (typeof value === \"string\") {\n return value.endsWith(\"/\") ? value : value + \"/\";\n }\n return value;\n })(string())\n})();\n\nexport const createSettingsCrud = ({\n storageOperations,\n getTenantId\n}: FileManagerConfig): SettingsCRUD => {\n return {\n async getSettings() {\n return storageOperations.settings.get({ tenant: getTenantId() });\n },\n async createSettings(data) {\n const settings = new CreateDataModel().populate(data);\n await settings.validate();\n\n const settingsData: FileManagerSettings = await settings.toJSON();\n\n return storageOperations.settings.create({\n data: { ...settingsData, tenant: getTenantId() }\n });\n },\n async updateSettings(data) {\n const updatedValue = new UpdateDataModel().populate(data);\n await updatedValue.validate();\n\n const existingSettings = (await storageOperations.settings.get({\n tenant: getTenantId()\n })) as FileManagerSettings;\n\n const updatedSettings: Partial<FileManagerSettings> = await updatedValue.toJSON({\n onlyDirty: true\n });\n\n return storageOperations.settings.update({\n original: existingSettings,\n data: {\n ...existingSettings,\n ...updatedSettings,\n tenant: getTenantId()\n }\n });\n },\n async deleteSettings() {\n await storageOperations.settings.delete({ tenant: getTenantId() });\n\n return true;\n }\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { SystemCRUD } from "../types";
2
+ import { FileManagerConfig } from "./index";
3
+ export declare const createSystemCrud: ({ storageOperations, getTenantId, getIdentity, WEBINY_VERSION }: FileManagerConfig) => SystemCRUD;