adminizer 4.2.0-build.49 → 4.2.0-build.51
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/assets/{VanillaJSONEditor-XGIlS4LL.js → VanillaJSONEditor-BsNSMuiI.js} +1 -1
- package/assets/add-BOrwsLPk.js +1 -0
- package/assets/{add-form-BLdLojfl.js → add-form-GQVVok4z.js} +1 -1
- package/assets/add-group-ClEk5H3m.js +1 -0
- package/assets/{add-group-form-_VEBFz_S.js → add-group-form-9dIdiUu3.js} +1 -1
- package/assets/add-user-BCfcjTsJ.js +1 -0
- package/assets/{add-user-form-BFAFyXuz.js → add-user-form-CKEPuXAX.js} +1 -1
- package/assets/{app-CXlohNEv.css → app-DcyaNUqI.css} +1 -1
- package/assets/{app-layout-NMKA6xAa.js → app-layout-MF9D28sb.js} +1 -1
- package/assets/{app-sidebar-C4Y6TSY3.js → app-sidebar-CBCrH_5b.js} +1 -1
- package/assets/app-sidebar-header-CT58bBx6.js +1 -0
- package/assets/app.js +2 -2
- package/assets/{breadcrumbs-D0gGjNVI.js → breadcrumbs-DXFXn-ln.js} +1 -1
- package/assets/{catalog-CEVSwmj8.js → catalog-h5-oFEgK.js} +2 -2
- package/assets/{dashboard-jLbWzL7K.js → dashboard-Ca0PxrpJ.js} +2 -2
- package/assets/{date-picker-SAfAWPoh.js → date-picker-lh34xHZl.js} +1 -1
- package/assets/{del-modal-Dj3n8iVJ.js → del-modal-CwKNFb9U.js} +1 -1
- package/assets/{field-renderer-BlBZuSiD.css → field-renderer-BkNaSbkZ.css} +1 -1
- package/assets/field-renderer-C-zyBIEM.js +411 -0
- package/assets/{form-CYsLdORv.js → form-B30gc4iL.js} +1 -1
- package/assets/form-xJzl5esP.js +1 -0
- package/assets/{handsontable-Dxb-hF7-.js → handsontable-CpTuVOqA.js} +1 -1
- package/assets/home-BrMSrnA_.js +2 -0
- package/assets/{icon-DQL8h8HI.js → icon-CS1X91Nz.js} +1 -1
- package/assets/{init-user-DZtnQ7VL.js → init-user--38KZHls.js} +1 -1
- package/assets/{input-error-BztTAmHq.js → input-error-BkhNs96U.js} +1 -1
- package/assets/list-Da5LZQoi.js +1 -0
- package/assets/{list-table-Du8TTXit.js → list-table-CSB-cBZ7.js} +1 -1
- package/assets/{login-2THGmUHc.js → login-BsyYLvZs.js} +1 -1
- package/assets/manifest.json +102 -80
- package/assets/{material-icon-CPvFwV5P.js → material-icon-08xik4mg.js} +1 -1
- package/assets/module-DF806s6D.js +1 -0
- package/assets/{monaco-editor-9fDiyfuW.js → monaco-editor-Cp_1Q01C.js} +1 -1
- package/assets/{multi-select-e4PqgWYn.js → multi-select-Dd_ADH13.js} +1 -1
- package/assets/nav-footer-CiLx5SB9.js +1 -0
- package/assets/nav-main-DgWcOcOI.js +1 -0
- package/assets/{nav-user-BWl2j-y-.js → nav-user-Cud95A62.js} +1 -1
- package/assets/{pagination-render-D6MBqi0B.js → pagination-render-CsKj8TwQ.js} +1 -1
- package/assets/{register-Dks3YdiZ.js → register-CQhM1bKw.js} +1 -1
- package/assets/theme-switcher-BJSJk_M4.js +1 -0
- package/assets/{toast-editor-1Pul3oMs.js → toast-editor-B9DGyj0_.js} +1 -1
- package/assets/use-appearance-CXP5cHaQ.js +1 -0
- package/assets/{user-info-DTsggabP.js → user-info-BSOJr6JQ.js} +1 -1
- package/assets/{user-menu-content-Dnh2qpwQ.js → user-menu-content-BcKOjCpg.js} +1 -1
- package/assets/welcome-Dq1qVeCh.js +1 -0
- package/helpers/inertiaAddHelper.d.ts +1 -1
- package/helpers/inertiaAddHelper.js +4 -0
- package/lib/Adminizer.js +2 -2
- package/lib/media-manager/DefaultMediaManager.d.ts +18 -0
- package/lib/media-manager/DefaultMediaManager.js +96 -125
- package/lib/media-manager/Items.d.ts +45 -0
- package/lib/media-manager/Items.js +273 -334
- package/lib/v4/DataAccessor.d.ts +1 -0
- package/lib/v4/DataAccessor.js +15 -8
- package/lib/v4/inertia/inertiaAdapter.js +1 -1
- package/lib/v4/model/adapter/sequelize.js +28 -19
- package/lib/v4/model/adapter/waterline.js +12 -4
- package/lib/v4/widgets/abstractCustom.d.ts +1 -1
- package/models/MediaManagerAP.d.ts +62 -0
- package/models/MediaManagerAP.js +45 -0
- package/models/MediaManagerAssociationsAP.d.ts +38 -0
- package/models/MediaManagerAssociationsAP.js +27 -0
- package/models/MediaManagerMetaAP.d.ts +30 -0
- package/models/MediaManagerMetaAP.js +21 -0
- package/package.json +10 -5
- package/system/bindMediaManager.d.ts +2 -0
- package/system/bindMediaManager.js +14 -20
- package/system/bindModels.js +3 -3
- package/assets/add-BzeOQ-DB.js +0 -1
- package/assets/add-group-Bx2s4UXM.js +0 -1
- package/assets/add-user-C3BY-sey.js +0 -1
- package/assets/app-sidebar-header-DQnbMxfM.js +0 -1
- package/assets/field-renderer-C7qCVvAC.js +0 -407
- package/assets/form-DjAQC5zI.js +0 -1
- package/assets/home-DfUM0yKC.js +0 -2
- package/assets/list-B1FodBkq.js +0 -1
- package/assets/module-D55s6p7N.js +0 -1
- package/assets/nav-footer-B7wjmsPb.js +0 -1
- package/assets/nav-main-Cx1BkIzi.js +0 -1
- package/assets/use-appearance-J8J2w43p.js +0 -1
- package/assets/welcome-HFROxPwP.js +0 -1
|
@@ -1,334 +1,273 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
//
|
|
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
|
-
//
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
//
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
//
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
//
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
//
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
//
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
//
|
|
150
|
-
|
|
151
|
-
//
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
//
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
//
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
//
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
//
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
//
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
//
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
//
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
//
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
//
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
//
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
//
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
// mimeType: file.mimetype,
|
|
275
|
-
// size: file.size,
|
|
276
|
-
// path: file.path,
|
|
277
|
-
// group: group,
|
|
278
|
-
// tag: localeId ? `loc:${localeId}` : `ver: ${variants.length + 1}`,
|
|
279
|
-
// filename: parent.filename,
|
|
280
|
-
// url: `/${this.path}/${filename}`,
|
|
281
|
-
// })
|
|
282
|
-
//
|
|
283
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
284
|
-
// return (await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({where: {id: item.id}}))
|
|
285
|
-
// }
|
|
286
|
-
//
|
|
287
|
-
// public async getVariants(id: string): Promise<MediaManagerItem[]> {
|
|
288
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
289
|
-
// let items = ((await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
290
|
-
// where: {id: id}
|
|
291
|
-
// }, {populate: [["variants", {sort: "createdAt DESC"}]]}))[0]).variants
|
|
292
|
-
// return (await populateVariants(this.adminizer, items, this.model))
|
|
293
|
-
// }
|
|
294
|
-
// }
|
|
295
|
-
//
|
|
296
|
-
// export class ApplicationItem extends TextItem {
|
|
297
|
-
// public type: MediaFileType = "application";
|
|
298
|
-
// }
|
|
299
|
-
//
|
|
300
|
-
// export class VideoItem extends TextItem {
|
|
301
|
-
// public type: MediaFileType = "video";
|
|
302
|
-
// }
|
|
303
|
-
//
|
|
304
|
-
//
|
|
305
|
-
// async function beforeDestroy(adminizer: Adminizer, criteria: { where: object }) {
|
|
306
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
307
|
-
// let parent: ModelsAP["MediaManagerAP"] = (await adminizer.modelHandler.model.get("MediaManagerAP")?.["_find"](criteria))[0]
|
|
308
|
-
// let meta = parent.meta
|
|
309
|
-
// for (const metaElement of meta) {
|
|
310
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
311
|
-
// await adminizer.modelHandler.model.get("MediaManagerMetaAP")?.["_destroy"]({id: metaElement.id})
|
|
312
|
-
// }
|
|
313
|
-
//
|
|
314
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
315
|
-
// let variants: ModelsAP["MediaManagerAP"]["variants"] = (await adminizer.modelHandler.model.get("MediaManagerAP")?.["_find"](criteria))[0].variants
|
|
316
|
-
// for (const child of variants) {
|
|
317
|
-
// // TODO refactor CRUD functions for DataAccessor usage
|
|
318
|
-
// await adminizer.modelHandler.model.get("MediaManagerAP")?.["_destroy"]({id: child.id})
|
|
319
|
-
// }
|
|
320
|
-
// }
|
|
321
|
-
//
|
|
322
|
-
//
|
|
323
|
-
// async function deleteFile(file: string) {
|
|
324
|
-
// try {
|
|
325
|
-
// await fs.promises.access(file);
|
|
326
|
-
// await fs.promises.unlink(file);
|
|
327
|
-
// } catch (err) {
|
|
328
|
-
// if (err.code === 'ENOENT') {
|
|
329
|
-
// } else if (err.code === 'EPERM') {
|
|
330
|
-
// } else {
|
|
331
|
-
// console.error(`An error occurred: ${err}`);
|
|
332
|
-
// }
|
|
333
|
-
// }
|
|
334
|
-
// }
|
|
1
|
+
import { File } from "./AbstractMediaManager";
|
|
2
|
+
import { populateVariants, randomFileName } from "./helpers/MediaManagerHelper";
|
|
3
|
+
import sizeOf from "image-size";
|
|
4
|
+
import sharp from "sharp";
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
export class ImageItem extends File {
|
|
8
|
+
type = "image";
|
|
9
|
+
model = "mediamanagerap";
|
|
10
|
+
metaModel = "mediamanagermetaap";
|
|
11
|
+
imageSizes;
|
|
12
|
+
adminizer;
|
|
13
|
+
constructor(adminizer, urlPathPrefix, fileStoragePath) {
|
|
14
|
+
super(urlPathPrefix, fileStoragePath);
|
|
15
|
+
this.imageSizes = adminizer.config.mediamanager.imageSizes || {};
|
|
16
|
+
this.adminizer = adminizer;
|
|
17
|
+
}
|
|
18
|
+
async getItems(limit, skip, sort, group) {
|
|
19
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
20
|
+
let data = await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
21
|
+
where: { parent: null, mimeType: { contains: this.type }, group: group },
|
|
22
|
+
limit: limit,
|
|
23
|
+
skip: skip,
|
|
24
|
+
sort: sort,
|
|
25
|
+
}, { populate: [["variants", { sort: sort }], ["meta", {}]] });
|
|
26
|
+
let next = await this.adminizer.modelHandler.model.get(this.model)['_count']({
|
|
27
|
+
where: { parent: null, mimeType: { contains: this.type }, group: group },
|
|
28
|
+
limit: limit,
|
|
29
|
+
skip: skip === 0 ? limit : skip + limit,
|
|
30
|
+
sort: sort,
|
|
31
|
+
});
|
|
32
|
+
for (let elem of data) {
|
|
33
|
+
elem.variants = await populateVariants(this.adminizer, elem.variants, this.model);
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
data: data,
|
|
37
|
+
next: !!next,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
async search(s, group) {
|
|
41
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
42
|
+
let data = await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
43
|
+
where: { filename: { contains: s }, mimeType: { contains: this.type }, parent: null, group: group },
|
|
44
|
+
sort: "createdAt DESC",
|
|
45
|
+
}, { populate: [["variants", { sort: "createdAt DESC" }]] });
|
|
46
|
+
for (let elem of data) {
|
|
47
|
+
elem.variants = await populateVariants(this.adminizer, elem.variants, this.model);
|
|
48
|
+
}
|
|
49
|
+
return data;
|
|
50
|
+
}
|
|
51
|
+
async upload(file, filename, origFileName, group) {
|
|
52
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
53
|
+
let parent = await this.adminizer.modelHandler.model.get(this.model)["_create"]({
|
|
54
|
+
parent: null,
|
|
55
|
+
mimeType: file.mimetype,
|
|
56
|
+
size: file.size,
|
|
57
|
+
path: file.path,
|
|
58
|
+
group: group,
|
|
59
|
+
tag: "origin",
|
|
60
|
+
filename: origFileName,
|
|
61
|
+
url: `/${this.path}/${filename}`,
|
|
62
|
+
});
|
|
63
|
+
await this.createMeta(parent.id);
|
|
64
|
+
await this.addFileMeta(file.path, parent.id);
|
|
65
|
+
// create file variants
|
|
66
|
+
if (Object.keys(this.imageSizes).length) {
|
|
67
|
+
await this.createVariants(file, parent, filename, group);
|
|
68
|
+
}
|
|
69
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
70
|
+
const item = await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({ where: { id: parent.id } });
|
|
71
|
+
item.variants = await populateVariants(this.adminizer, item.variants, this.model);
|
|
72
|
+
return [item];
|
|
73
|
+
}
|
|
74
|
+
async getVariants(id) {
|
|
75
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
76
|
+
let items = ((await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
77
|
+
where: { id: id }
|
|
78
|
+
}, { populate: [["variants", { sort: "createdAt DESC" }]] }))[0]).variants;
|
|
79
|
+
return (await populateVariants(this.adminizer, items, this.model));
|
|
80
|
+
}
|
|
81
|
+
async createVariants(file, parent, filename, group) {
|
|
82
|
+
for (const sizeKey of Object.keys(this.imageSizes)) {
|
|
83
|
+
let sizeName = randomFileName(filename, sizeKey, false);
|
|
84
|
+
let { width, height } = this.imageSizes[sizeKey];
|
|
85
|
+
const buffer = fs.readFileSync(file.path);
|
|
86
|
+
const image = sizeOf(buffer);
|
|
87
|
+
if (image.width < width ||
|
|
88
|
+
image.height < height)
|
|
89
|
+
continue;
|
|
90
|
+
let newFile = await this.resizeImage(file.path, `${this.dir}${sizeName}`, width, height);
|
|
91
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
92
|
+
let newSize = await this.adminizer.modelHandler.model.get(this.model)["_create"]({
|
|
93
|
+
parent: parent.id,
|
|
94
|
+
mimeType: parent.mimeType,
|
|
95
|
+
size: newFile.size,
|
|
96
|
+
filename: parent.filename,
|
|
97
|
+
group: group,
|
|
98
|
+
path: `${this.dir}${sizeName}`,
|
|
99
|
+
tag: `saze:${sizeKey}`,
|
|
100
|
+
url: `/${this.path}/${sizeName}`,
|
|
101
|
+
});
|
|
102
|
+
await this.addFileMeta(`${this.dir}${sizeName}`, newSize.id);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
async getOrigin(id) {
|
|
106
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
107
|
+
return (await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({ where: { id: id } })).path;
|
|
108
|
+
}
|
|
109
|
+
async createMeta(id) {
|
|
110
|
+
//create empty meta
|
|
111
|
+
let metaData = {
|
|
112
|
+
author: "",
|
|
113
|
+
description: "",
|
|
114
|
+
title: "",
|
|
115
|
+
};
|
|
116
|
+
for (const key of Object.keys(metaData)) {
|
|
117
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
118
|
+
await this.adminizer.modelHandler.model.get(this.metaModel)["_create"]({
|
|
119
|
+
key: key,
|
|
120
|
+
value: metaData[key],
|
|
121
|
+
parent: id,
|
|
122
|
+
isPublic: true
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async addFileMeta(file, id) {
|
|
127
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
128
|
+
const metaBuffer = fs.readFileSync(file);
|
|
129
|
+
await this.adminizer.modelHandler.model.get(this.metaModel)["_create"]({
|
|
130
|
+
key: 'imageSizes',
|
|
131
|
+
value: sizeOf(metaBuffer),
|
|
132
|
+
parent: id,
|
|
133
|
+
isPublic: false
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
async getMeta(id) {
|
|
137
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
138
|
+
return ((await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
139
|
+
id: id
|
|
140
|
+
}, { populate: [["meta", { where: { isPublic: true } }]] }))[0]).meta;
|
|
141
|
+
}
|
|
142
|
+
async setMeta(id, data) {
|
|
143
|
+
for (const key of Object.keys(data)) {
|
|
144
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
145
|
+
await this.adminizer.modelHandler.model.get(this.metaModel)["_update"]({ parent: id, key: key }, { value: data[key] });
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async resizeImage(input, output, width, height) {
|
|
149
|
+
// Get the directory from the output path
|
|
150
|
+
const outputDir = path.dirname(output);
|
|
151
|
+
// Check if the directory exists, and create it if it doesn't
|
|
152
|
+
if (!fs.existsSync(outputDir)) {
|
|
153
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
154
|
+
}
|
|
155
|
+
// Resize the image and save it to the output path
|
|
156
|
+
return await sharp(input)
|
|
157
|
+
.resize({ width: width, height: height })
|
|
158
|
+
.toFile(output);
|
|
159
|
+
}
|
|
160
|
+
async uploadVariant(parent, file, filename, group, localeId) {
|
|
161
|
+
const variantBuffer = fs.readFileSync(file.path);
|
|
162
|
+
const { width, height } = sizeOf(variantBuffer);
|
|
163
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
164
|
+
let item = await this.adminizer.modelHandler.model.get(this.model)["_create"]({
|
|
165
|
+
parent: parent.id,
|
|
166
|
+
mimeType: file.mimetype,
|
|
167
|
+
size: file.size,
|
|
168
|
+
path: file.path,
|
|
169
|
+
group: group,
|
|
170
|
+
tag: localeId ? `loc:${localeId}` : `size:${width}x${height}`,
|
|
171
|
+
filename: parent.filename,
|
|
172
|
+
url: `/${this.path}/${filename}`,
|
|
173
|
+
});
|
|
174
|
+
await this.addFileMeta(file.path, item.id);
|
|
175
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
176
|
+
return (await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({ where: { id: item.id } }));
|
|
177
|
+
}
|
|
178
|
+
async delete(id) {
|
|
179
|
+
const criteria = { where: { id: id } };
|
|
180
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
181
|
+
let record = await this.adminizer.modelHandler.model.get(this.model)["_findOne"](criteria);
|
|
182
|
+
await beforeDestroy(this.adminizer, criteria);
|
|
183
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
184
|
+
await this.adminizer.modelHandler.model.get(this.model)["_destroy"](criteria);
|
|
185
|
+
await deleteFile(record.path);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/*
|
|
189
|
+
* Text item
|
|
190
|
+
*/
|
|
191
|
+
export class TextItem extends ImageItem {
|
|
192
|
+
type = "text";
|
|
193
|
+
async upload(file, filename, origFileName, group) {
|
|
194
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
195
|
+
let parent = await this.adminizer.modelHandler.model.get(this.model)["_create"]({
|
|
196
|
+
parent: null,
|
|
197
|
+
mimeType: file.mimetype,
|
|
198
|
+
size: file.size,
|
|
199
|
+
path: file.path,
|
|
200
|
+
group: group,
|
|
201
|
+
filename: origFileName,
|
|
202
|
+
tag: "origin",
|
|
203
|
+
url: `/${this.path}/${filename}`,
|
|
204
|
+
});
|
|
205
|
+
await this.createMeta(parent.id);
|
|
206
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
207
|
+
const item = await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({ where: { id: parent.id } });
|
|
208
|
+
item.variants = await populateVariants(this.adminizer, item.variants, this.model);
|
|
209
|
+
return [item];
|
|
210
|
+
}
|
|
211
|
+
getvariants() {
|
|
212
|
+
return Promise.resolve([]);
|
|
213
|
+
}
|
|
214
|
+
async uploadVariant(parent, file, filename, group, localeId) {
|
|
215
|
+
let variants = parent.variants.filter(e => /^loc:/.test(e.tag) === false);
|
|
216
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
217
|
+
let item = await this.adminizer.modelHandler.model.get(this.model)["_create"]({
|
|
218
|
+
parent: parent.id,
|
|
219
|
+
mimeType: file.mimetype,
|
|
220
|
+
size: file.size,
|
|
221
|
+
path: file.path,
|
|
222
|
+
group: group,
|
|
223
|
+
tag: localeId ? `loc:${localeId}` : `ver: ${variants.length + 1}`,
|
|
224
|
+
filename: parent.filename,
|
|
225
|
+
url: `/${this.path}/${filename}`,
|
|
226
|
+
});
|
|
227
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
228
|
+
return (await this.adminizer.modelHandler.model.get(this.model)["_findOne"]({ where: { id: item.id } }));
|
|
229
|
+
}
|
|
230
|
+
async getVariants(id) {
|
|
231
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
232
|
+
let items = ((await this.adminizer.modelHandler.model.get(this.model)["_find"]({
|
|
233
|
+
where: { id: id }
|
|
234
|
+
}, { populate: [["variants", { sort: "createdAt DESC" }]] }))[0]).variants;
|
|
235
|
+
return (await populateVariants(this.adminizer, items, this.model));
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
export class ApplicationItem extends TextItem {
|
|
239
|
+
type = "application";
|
|
240
|
+
}
|
|
241
|
+
export class VideoItem extends TextItem {
|
|
242
|
+
type = "video";
|
|
243
|
+
}
|
|
244
|
+
async function beforeDestroy(adminizer, criteria) {
|
|
245
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
246
|
+
let parent = (await adminizer.modelHandler.model.get("MediaManagerAP")?.["_find"](criteria))[0];
|
|
247
|
+
let meta = parent.meta;
|
|
248
|
+
for (const metaElement of meta) {
|
|
249
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
250
|
+
await adminizer.modelHandler.model.get("MediaManagerMetaAP")?.["_destroy"]({ id: metaElement.id });
|
|
251
|
+
}
|
|
252
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
253
|
+
let variants = (await adminizer.modelHandler.model.get("MediaManagerAP")?.["_find"](criteria))[0].variants;
|
|
254
|
+
for (const child of variants) {
|
|
255
|
+
// TODO refactor CRUD functions for DataAccessor usage
|
|
256
|
+
await adminizer.modelHandler.model.get("MediaManagerAP")?.["_destroy"]({ id: child.id });
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
async function deleteFile(file) {
|
|
260
|
+
try {
|
|
261
|
+
await fs.promises.access(file);
|
|
262
|
+
await fs.promises.unlink(file);
|
|
263
|
+
}
|
|
264
|
+
catch (err) {
|
|
265
|
+
if (err.code === 'ENOENT') {
|
|
266
|
+
}
|
|
267
|
+
else if (err.code === 'EPERM') {
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
console.error(`An error occurred: ${err}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
package/lib/v4/DataAccessor.d.ts
CHANGED
|
@@ -14,6 +14,7 @@ export declare class DataAccessor {
|
|
|
14
14
|
private fields;
|
|
15
15
|
private actionVerb;
|
|
16
16
|
constructor(adminizer: Adminizer, user: UserAP, entity: Entity, action: ActionType);
|
|
17
|
+
private getModelConfig;
|
|
17
18
|
/**
|
|
18
19
|
* Retrieves the fields for the given entity based on action type,
|
|
19
20
|
* taking into account access rights and configuration settings.
|