@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.
- package/createFileManager/checkBasePermissions.d.ts +5 -0
- package/createFileManager/checkBasePermissions.js +24 -0
- package/createFileManager/checkBasePermissions.js.map +1 -0
- package/createFileManager/files.crud.d.ts +3 -0
- package/createFileManager/files.crud.js +318 -0
- package/createFileManager/files.crud.js.map +1 -0
- package/createFileManager/filevalidation.disabled.d.ts +0 -0
- package/createFileManager/filevalidation.disabled.js +55 -0
- package/createFileManager/filevalidation.disabled.js.map +1 -0
- package/createFileManager/index.d.ts +13 -0
- package/createFileManager/index.js +20 -0
- package/createFileManager/index.js.map +1 -0
- package/createFileManager/settings.crud.d.ts +3 -0
- package/createFileManager/settings.crud.js +91 -0
- package/createFileManager/settings.crud.js.map +1 -0
- package/createFileManager/system.crud.d.ts +3 -0
- package/createFileManager/system.crud.js +86 -0
- package/createFileManager/system.crud.js.map +1 -0
- package/graphql/index.d.ts +3 -0
- package/graphql/index.js +288 -0
- package/graphql/index.js.map +1 -0
- package/handlers/download/byAlias.d.ts +6 -0
- package/handlers/download/byAlias.js +89 -0
- package/handlers/download/byAlias.js.map +1 -0
- package/handlers/download/byExactKey.d.ts +2 -0
- package/handlers/download/byExactKey.js +57 -0
- package/handlers/download/byExactKey.js.map +1 -0
- package/handlers/download/extractFileInformation.d.ts +9 -0
- package/handlers/download/extractFileInformation.js +20 -0
- package/handlers/download/extractFileInformation.js.map +1 -0
- package/handlers/download/getS3Object.d.ts +10 -0
- package/handlers/download/getS3Object.js +57 -0
- package/handlers/download/getS3Object.js.map +1 -0
- package/handlers/download/index.d.ts +2 -3
- package/handlers/download/index.js +21 -126
- package/handlers/download/index.js.map +1 -1
- package/handlers/manage/index.js +0 -16
- package/handlers/manage/index.js.map +1 -1
- package/handlers/transform/index.js +12 -19
- package/handlers/transform/index.js.map +1 -1
- package/handlers/transform/legacyUtils.d.ts +17 -0
- package/handlers/transform/legacyUtils.js +42 -0
- package/handlers/transform/legacyUtils.js.map +1 -0
- package/handlers/transform/loaders/imageLoader.d.ts +1 -1
- package/handlers/transform/loaders/imageLoader.js +12 -23
- package/handlers/transform/loaders/imageLoader.js.map +1 -1
- package/handlers/transform/loaders/index.d.ts +1 -1
- package/handlers/transform/loaders/index.js +0 -3
- package/handlers/transform/loaders/index.js.map +1 -1
- package/handlers/transform/loaders/sanitizeImageTransformations.js +0 -13
- package/handlers/transform/loaders/sanitizeImageTransformations.js.map +1 -1
- package/handlers/transform/managers/imageManager.js +32 -21
- package/handlers/transform/managers/imageManager.js.map +1 -1
- package/handlers/transform/managers/index.js +0 -3
- package/handlers/transform/managers/index.js.map +1 -1
- package/handlers/transform/optimizeImage.js +0 -6
- package/handlers/transform/optimizeImage.js.map +1 -1
- package/handlers/transform/transformImage.js +0 -5
- package/handlers/transform/transformImage.js.map +1 -1
- package/handlers/transform/utils.d.ts +1 -1
- package/handlers/transform/utils.js +7 -17
- package/handlers/transform/utils.js.map +1 -1
- package/handlers/utils/getEnvironment.js +0 -2
- package/handlers/utils/getEnvironment.js.map +1 -1
- package/handlers/utils/getObjectParams.js +0 -4
- package/handlers/utils/getObjectParams.js.map +1 -1
- package/handlers/utils/index.js +0 -3
- package/handlers/utils/index.js.map +1 -1
- package/index.d.ts +6 -0
- package/index.js +68 -0
- package/index.js.map +1 -0
- package/package.json +21 -23
- package/plugins/FilePhysicalStoragePlugin.d.ts +21 -0
- package/plugins/FilePhysicalStoragePlugin.js +31 -0
- package/plugins/FilePhysicalStoragePlugin.js.map +1 -0
- package/plugins/FileStorageTransformPlugin.d.ts +34 -0
- package/plugins/FileStorageTransformPlugin.js +40 -0
- package/plugins/FileStorageTransformPlugin.js.map +1 -0
- package/plugins/graphql.js +3 -3
- package/plugins/graphql.js.map +1 -1
- package/plugins/index.d.ts +2 -2
- package/plugins/index.js +22 -19
- package/plugins/index.js.map +1 -1
- package/storage/FileStorage.d.ts +32 -0
- package/storage/FileStorage.js +86 -0
- package/storage/FileStorage.js.map +1 -0
- package/types/file.d.ts +33 -0
- package/types/file.js +5 -0
- package/types/file.js.map +1 -0
- package/types/file.lifecycle.d.ts +40 -0
- package/types/file.lifecycle.js +5 -0
- package/types/file.lifecycle.js.map +1 -0
- package/types.d.ts +44 -45
- package/types.js +22 -0
- package/types.js.map +1 -1
|
@@ -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,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,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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"}
|