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