@jrmc/adonis-attachment 4.0.0 → 5.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/index.d.ts +1 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +1 -0
- package/build/providers/attachment_provider.d.ts +7 -0
- package/build/providers/attachment_provider.d.ts.map +1 -1
- package/build/providers/attachment_provider.js +7 -0
- package/build/src/adapters/blurhash.d.ts +6 -0
- package/build/src/adapters/blurhash.d.ts.map +1 -1
- package/build/src/adapters/blurhash.js +6 -0
- package/build/src/adapters/exif.d.ts +1 -1
- package/build/src/adapters/exif.d.ts.map +1 -1
- package/build/src/adapters/exif.js +41 -11
- package/build/src/adapters/ffmpeg.d.ts +19 -0
- package/build/src/adapters/ffmpeg.d.ts.map +1 -0
- package/build/src/adapters/ffmpeg.js +115 -0
- package/build/src/adapters/meta.d.ts +6 -0
- package/build/src/adapters/meta.d.ts.map +1 -1
- package/build/src/adapters/meta.js +6 -0
- package/build/src/adapters/poppler.d.ts +20 -0
- package/build/src/adapters/poppler.d.ts.map +1 -0
- package/build/src/adapters/poppler.js +116 -0
- package/build/src/adapters/soffice.d.ts +14 -0
- package/build/src/adapters/soffice.d.ts.map +1 -0
- package/build/src/adapters/soffice.js +64 -0
- package/build/src/attachment_manager.d.ts +1 -0
- package/build/src/attachment_manager.d.ts.map +1 -1
- package/build/src/attachment_manager.js +3 -0
- package/build/src/attachments/attachment.d.ts.map +1 -1
- package/build/src/attachments/attachment.js +1 -0
- package/build/src/attachments/attachment_base.d.ts +2 -0
- package/build/src/attachments/attachment_base.d.ts.map +1 -1
- package/build/src/attachments/attachment_base.js +9 -0
- package/build/src/controllers/attachments_controller.d.ts +5 -0
- package/build/src/controllers/attachments_controller.d.ts.map +1 -0
- package/build/src/controllers/attachments_controller.js +87 -0
- package/build/src/converter_manager.d.ts +7 -1
- package/build/src/converter_manager.d.ts.map +1 -1
- package/build/src/converter_manager.js +7 -5
- package/build/src/converters/autodetect_converter.d.ts.map +1 -1
- package/build/src/converters/autodetect_converter.js +47 -2
- package/build/src/converters/document_thumbnail_converter.d.ts +1 -1
- package/build/src/converters/document_thumbnail_converter.d.ts.map +1 -1
- package/build/src/converters/document_thumbnail_converter.js +15 -33
- package/build/src/converters/pdf_thumbnail_converter.d.ts +1 -1
- package/build/src/converters/pdf_thumbnail_converter.d.ts.map +1 -1
- package/build/src/converters/pdf_thumbnail_converter.js +17 -20
- package/build/src/converters/video_thumbnail_converter.d.ts +1 -1
- package/build/src/converters/video_thumbnail_converter.d.ts.map +1 -1
- package/build/src/converters/video_thumbnail_converter.js +11 -26
- package/build/src/decorators/attachment.d.ts.map +1 -1
- package/build/src/define_config.d.ts +1 -0
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +6 -1
- package/build/src/services/record_with_attachment.d.ts +1 -0
- package/build/src/services/record_with_attachment.d.ts.map +1 -1
- package/build/src/services/record_with_attachment.js +25 -0
- package/build/src/types/attachment.d.ts +2 -0
- package/build/src/types/attachment.d.ts.map +1 -1
- package/build/src/types/config.d.ts +7 -4
- package/build/src/types/config.d.ts.map +1 -1
- package/build/src/types/converter.d.ts +2 -0
- package/build/src/types/converter.d.ts.map +1 -1
- package/build/src/types/index.d.ts +1 -0
- package/build/src/types/index.d.ts.map +1 -1
- package/build/src/types/index.js +1 -0
- package/build/src/types/input.d.ts +5 -0
- package/build/src/types/input.d.ts.map +1 -1
- package/build/src/types/metadata.d.ts +18 -0
- package/build/src/types/metadata.d.ts.map +1 -0
- package/build/src/types/metadata.js +1 -0
- package/build/src/utils/default_values.js +1 -1
- package/build/src/utils/helpers.d.ts +1 -0
- package/build/src/utils/helpers.d.ts.map +1 -1
- package/build/src/utils/helpers.js +6 -0
- package/build/src/utils/hooks.d.ts.map +1 -1
- package/build/src/utils/hooks.js +1 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -3
|
@@ -35,6 +35,8 @@ export declare class AttachmentBase implements AttachmentBaseInterface {
|
|
|
35
35
|
getStream(): Promise<import("stream").Readable>;
|
|
36
36
|
getUrl(): Promise<string>;
|
|
37
37
|
getSignedUrl(signedUrlOptions?: SignedURLOptions): Promise<string>;
|
|
38
|
+
getKeyId(): string | undefined;
|
|
39
|
+
setKeyId(keyId: string): this;
|
|
38
40
|
setOptions(options: LucidOptions): this;
|
|
39
41
|
makeFolder(record?: LucidRow): this;
|
|
40
42
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment_base.d.ts","sourceRoot":"","sources":["../../../src/attachments/attachment_base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,cAAc,IAAI,uBAAuB,EAC1C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAOpD,qBAAa,cAAe,YAAW,uBAAuB;;IAC5D,KAAK,EAAE,YAAY,CAAA;IAEnB,KAAK,CAAC,EAAE,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"attachment_base.d.ts","sourceRoot":"","sources":["../../../src/attachments/attachment_base.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC3E,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,cAAc,IAAI,uBAAuB,EAC1C,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAOpD,qBAAa,cAAe,YAAW,uBAAuB;;IAC5D,KAAK,EAAE,YAAY,CAAA;IAEnB,KAAK,CAAC,EAAE,KAAK,CAAA;IAMb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ,OAAO,EAAE,YAAY,CAAA;gBAET,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,wBAAwB,EAAE,KAAK,CAAC,EAAE,KAAK;IAsBpF;;OAEG;IAEH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,MAAM,IAAI,MAAM,GAAG,SAAS,CAW/B;IAED,IAAI,IAAI,IAAI,MAAM,CAMjB;IAED;;OAEG;IAEH,OAAO;IAIP,QAAQ;IAIF,SAAS;IAKf,SAAS;IAIT,MAAM;IAIN,YAAY,CAAC,gBAAgB,CAAC,EAAE,gBAAgB;IAIhD,QAAQ;IAIR,QAAQ,CAAC,KAAK,EAAE,MAAM;IAKtB,UAAU,CAAC,OAAO,EAAE,YAAY;IAQhC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ;IAwB5B;;OAEG;IAEH,QAAQ,IAAI,wBAAwB;IAYpC,MAAM,IAAI,MAAM;CAUjB"}
|
|
@@ -12,6 +12,7 @@ import { extractPathParameters } from '../utils/helpers.js';
|
|
|
12
12
|
export class AttachmentBase {
|
|
13
13
|
drive;
|
|
14
14
|
input;
|
|
15
|
+
#keyId;
|
|
15
16
|
#name;
|
|
16
17
|
#folder;
|
|
17
18
|
size;
|
|
@@ -84,6 +85,13 @@ export class AttachmentBase {
|
|
|
84
85
|
getSignedUrl(signedUrlOptions) {
|
|
85
86
|
return this.getDisk().getSignedUrl(this.path, signedUrlOptions);
|
|
86
87
|
}
|
|
88
|
+
getKeyId() {
|
|
89
|
+
return this.#keyId;
|
|
90
|
+
}
|
|
91
|
+
setKeyId(keyId) {
|
|
92
|
+
this.#keyId = keyId;
|
|
93
|
+
return this;
|
|
94
|
+
}
|
|
87
95
|
setOptions(options) {
|
|
88
96
|
this.options = {
|
|
89
97
|
...this.options,
|
|
@@ -117,6 +125,7 @@ export class AttachmentBase {
|
|
|
117
125
|
*/
|
|
118
126
|
toObject() {
|
|
119
127
|
return {
|
|
128
|
+
keyId: this.getKeyId(),
|
|
120
129
|
name: this.name,
|
|
121
130
|
extname: this.extname,
|
|
122
131
|
size: this.size,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments_controller.d.ts","sourceRoot":"","sources":["../../../src/controllers/attachments_controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAkBtD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAElC,MAAM,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,WAAW;CA2FhD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import encryption from '@adonisjs/core/services/encryption';
|
|
3
|
+
import db from '@adonisjs/lucid/services/db';
|
|
4
|
+
import { attachmentManager } from '@jrmc/adonis-attachment';
|
|
5
|
+
import { ConverterManager } from '../converter_manager.js';
|
|
6
|
+
import { Readable } from 'node:stream';
|
|
7
|
+
export default class AttachmentsController {
|
|
8
|
+
async handle({ request, response }) {
|
|
9
|
+
const { key } = request.params();
|
|
10
|
+
const format = request.qs()?.variant;
|
|
11
|
+
const index = request.qs()?.index;
|
|
12
|
+
let isAttachments = false;
|
|
13
|
+
const data = encryption.decrypt(key);
|
|
14
|
+
const queryWithTableSelection = await db
|
|
15
|
+
.from(data.model)
|
|
16
|
+
.select(data.attribute)
|
|
17
|
+
.where('id', data.id).first();
|
|
18
|
+
/*
|
|
19
|
+
* 1. Get the entity
|
|
20
|
+
*/
|
|
21
|
+
let result = JSON.parse(queryWithTableSelection[data.attribute]);
|
|
22
|
+
if (Array.isArray(result)) {
|
|
23
|
+
isAttachments = true;
|
|
24
|
+
result = result[index || 0];
|
|
25
|
+
}
|
|
26
|
+
result.folder = path.dirname(result.path);
|
|
27
|
+
/*
|
|
28
|
+
* 2. Get the attachment
|
|
29
|
+
*/
|
|
30
|
+
const attachment = attachmentManager.createFromDbResponse(result);
|
|
31
|
+
attachment?.setOptions(data?.options);
|
|
32
|
+
if (!attachment) {
|
|
33
|
+
return response.notFound();
|
|
34
|
+
}
|
|
35
|
+
/*
|
|
36
|
+
* 4. Get the variant
|
|
37
|
+
*/
|
|
38
|
+
const variant = attachment?.getVariant(format);
|
|
39
|
+
/*
|
|
40
|
+
* 5. Get the stream
|
|
41
|
+
* if variant and path, get the stream and return it
|
|
42
|
+
* if not, generate the variant
|
|
43
|
+
* if not, return the default file
|
|
44
|
+
*/
|
|
45
|
+
if (variant && variant?.path) {
|
|
46
|
+
const image = await variant.getStream();
|
|
47
|
+
const readable = Readable.from(image);
|
|
48
|
+
response.header('Content-Type', variant?.mimeType);
|
|
49
|
+
response.stream(readable);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
let attachmentOrAttachmentsString;
|
|
53
|
+
const converter = (await attachmentManager.getConverter(format));
|
|
54
|
+
const variant = await ConverterManager.generate({
|
|
55
|
+
key: format,
|
|
56
|
+
attachment,
|
|
57
|
+
converter
|
|
58
|
+
});
|
|
59
|
+
if (isAttachments) {
|
|
60
|
+
attachmentOrAttachmentsString = JSON.stringify([attachment.toObject()]);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
attachmentOrAttachmentsString = JSON.stringify(attachment.toObject());
|
|
64
|
+
}
|
|
65
|
+
const trx = await db.transaction();
|
|
66
|
+
// trx.after('rollback', rollback)
|
|
67
|
+
try {
|
|
68
|
+
await trx.query().from(data.model).where('id', data.id).update({
|
|
69
|
+
[data.attribute]: attachmentOrAttachmentsString
|
|
70
|
+
});
|
|
71
|
+
await trx.commit();
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
await trx.rollback();
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
if (!variant) {
|
|
78
|
+
return response.notFound();
|
|
79
|
+
}
|
|
80
|
+
const image = await variant.getStream();
|
|
81
|
+
const readable = Readable.from(image);
|
|
82
|
+
response.header('Content-Type', variant.mimeType);
|
|
83
|
+
response.stream(readable);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -1,7 +1,13 @@
|
|
|
1
|
-
import type { ConverterInitializeAttributes } from './types/converter.js';
|
|
1
|
+
import type { Converter, ConverterInitializeAttributes } from './types/converter.js';
|
|
2
|
+
import type { Attachment, Variant } from './types/attachment.js';
|
|
2
3
|
export declare class ConverterManager {
|
|
3
4
|
#private;
|
|
4
5
|
constructor({ record, attributeName, options, filters }: ConverterInitializeAttributes);
|
|
5
6
|
run(): Promise<void>;
|
|
7
|
+
static generate({ key, attachment, converter }: {
|
|
8
|
+
key: string;
|
|
9
|
+
attachment: Attachment;
|
|
10
|
+
converter: Converter;
|
|
11
|
+
}): Promise<Variant | undefined>;
|
|
6
12
|
}
|
|
7
13
|
//# sourceMappingURL=converter_manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"converter_manager.d.ts","sourceRoot":"","sources":["../../src/converter_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"converter_manager.d.ts","sourceRoot":"","sources":["../../src/converter_manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AACpF,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAgB,MAAM,uBAAuB,CAAA;AAS9E,qBAAa,gBAAgB;;gBAQf,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,6BAA6B;IAOhF,GAAG;WAyCI,QAAQ,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,EAAG;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,UAAU,CAAC;QAAC,SAAS,EAAE,SAAS,CAAA;KAAE;CA6FrH"}
|
|
@@ -2,7 +2,6 @@ import logger from '@adonisjs/core/services/logger';
|
|
|
2
2
|
import string from '@adonisjs/core/helpers/string';
|
|
3
3
|
import db from '@adonisjs/lucid/services/db';
|
|
4
4
|
import attachmentManager from '../services/main.js';
|
|
5
|
-
import * as errors from './errors.js';
|
|
6
5
|
import { streamToTempFile } from './utils/helpers.js';
|
|
7
6
|
export class ConverterManager {
|
|
8
7
|
#record;
|
|
@@ -31,12 +30,14 @@ export class ConverterManager {
|
|
|
31
30
|
const converter = (await attachmentManager.getConverter(key));
|
|
32
31
|
if (converter) {
|
|
33
32
|
for await (const attachment of attachments) {
|
|
34
|
-
const variant = await
|
|
33
|
+
const variant = await ConverterManager.generate({
|
|
35
34
|
key,
|
|
36
35
|
attachment,
|
|
37
36
|
converter
|
|
38
37
|
});
|
|
39
|
-
|
|
38
|
+
if (variant) {
|
|
39
|
+
variants.push(variant);
|
|
40
|
+
}
|
|
40
41
|
}
|
|
41
42
|
}
|
|
42
43
|
}
|
|
@@ -46,7 +47,7 @@ export class ConverterManager {
|
|
|
46
47
|
}
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
|
-
async
|
|
50
|
+
static async generate({ key, attachment, converter }) {
|
|
50
51
|
let input = attachment.input;
|
|
51
52
|
if (!input) {
|
|
52
53
|
input = await streamToTempFile(await attachment.getStream());
|
|
@@ -56,7 +57,8 @@ export class ConverterManager {
|
|
|
56
57
|
options: converter.options,
|
|
57
58
|
});
|
|
58
59
|
if (output === undefined) {
|
|
59
|
-
throw new errors.E_CANNOT_PATH_BY_CONVERTER()
|
|
60
|
+
// throw new errors.E_CANNOT_PATH_BY_CONVERTER()
|
|
61
|
+
return;
|
|
60
62
|
}
|
|
61
63
|
const variant = await attachment.createVariant(key, output);
|
|
62
64
|
if (converter.options.blurhash) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autodetect_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/autodetect_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"autodetect_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/autodetect_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAMtC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IAClD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;CAoElF"}
|
|
@@ -8,6 +8,8 @@ import { fileTypeFromBuffer, fileTypeFromFile } from 'file-type';
|
|
|
8
8
|
import Converter from './converter.js';
|
|
9
9
|
import ImageConverter from './image_converter.js';
|
|
10
10
|
import VideoThumnailConverter from './video_thumbnail_converter.js';
|
|
11
|
+
import DocumentThumbnailConverter from './document_thumbnail_converter.js';
|
|
12
|
+
import PdfThumbnailConverter from './pdf_thumbnail_converter.js';
|
|
11
13
|
export default class AutodetectConverter extends Converter {
|
|
12
14
|
async handle({ input, options }) {
|
|
13
15
|
let converter;
|
|
@@ -18,11 +20,54 @@ export default class AutodetectConverter extends Converter {
|
|
|
18
20
|
else {
|
|
19
21
|
fileType = await fileTypeFromFile(input);
|
|
20
22
|
}
|
|
21
|
-
if (fileType
|
|
23
|
+
if (!fileType) {
|
|
24
|
+
fileType = {
|
|
25
|
+
mime: 'text/plain',
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
if (fileType?.mime.includes('image')) {
|
|
29
|
+
converter = new ImageConverter(options, this.binPaths);
|
|
30
|
+
}
|
|
31
|
+
else if (fileType?.mime.includes('video')) {
|
|
22
32
|
converter = new VideoThumnailConverter(options, this.binPaths);
|
|
23
33
|
}
|
|
34
|
+
else if (fileType?.mime.includes('pdf')) {
|
|
35
|
+
converter = new PdfThumbnailConverter(options, this.binPaths);
|
|
36
|
+
}
|
|
37
|
+
else if (
|
|
38
|
+
// Documents texte
|
|
39
|
+
fileType?.mime.includes('application/vnd.openxmlformats-officedocument.wordprocessingml.document') || // .docx
|
|
40
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.text') || // .odt
|
|
41
|
+
fileType?.mime.includes('application/msword') || // .doc
|
|
42
|
+
fileType?.mime.includes('application/rtf') || // .rtf
|
|
43
|
+
fileType?.mime.includes('text/plain') || // .txt
|
|
44
|
+
fileType?.mime.includes('application/xml') || // .xml, .svg
|
|
45
|
+
// Feuilles de calcul
|
|
46
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.spreadsheet') || // .ods
|
|
47
|
+
fileType?.mime.includes('application/vnd.ms-excel') || // .xls
|
|
48
|
+
fileType?.mime.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') || // .xlsx
|
|
49
|
+
fileType?.mime.includes('text/csv') || // .csv
|
|
50
|
+
// Présentations
|
|
51
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.presentation') || // .odp
|
|
52
|
+
fileType?.mime.includes('application/vnd.ms-powerpoint') || // .ppt
|
|
53
|
+
fileType?.mime.includes('application/vnd.openxmlformats-officedocument.presentationml.presentation') || // .pptx
|
|
54
|
+
// Dessins
|
|
55
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.graphics') || // .odg
|
|
56
|
+
fileType?.mime.includes('application/vnd.visio') || // .vsd
|
|
57
|
+
// Formules mathématiques
|
|
58
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.formula') || // .odf
|
|
59
|
+
fileType?.mime.includes('application/mathml+xml') || // .mml
|
|
60
|
+
// Bases de données
|
|
61
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument.database') || // .odb
|
|
62
|
+
fileType?.mime.includes('application/x-msaccess') || // .mdb, .accdb
|
|
63
|
+
// Autres formats Office
|
|
64
|
+
fileType?.mime.includes('application/vnd.ms-office') || // Formats MS Office génériques
|
|
65
|
+
fileType?.mime.includes('application/vnd.oasis.opendocument') // Formats OpenDocument génériques
|
|
66
|
+
) {
|
|
67
|
+
converter = new DocumentThumbnailConverter(options, this.binPaths);
|
|
68
|
+
}
|
|
24
69
|
else {
|
|
25
|
-
|
|
70
|
+
return;
|
|
26
71
|
}
|
|
27
72
|
return converter.handle({
|
|
28
73
|
input,
|
|
@@ -9,6 +9,6 @@ import type { Input } from '../types/input.js';
|
|
|
9
9
|
import Converter from './converter.js';
|
|
10
10
|
export default class DocumentThumbnailConverter extends Converter {
|
|
11
11
|
handle({ input, options }: ConverterAttributes): Promise<Input>;
|
|
12
|
-
documentToImage(
|
|
12
|
+
documentToImage(input: Input): Promise<string>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=document_thumbnail_converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/document_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"document_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/document_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAItC,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IACzD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;IAc/D,eAAe,CAAC,KAAK,EAAE,KAAK;CAiBnC"}
|
|
@@ -4,51 +4,33 @@
|
|
|
4
4
|
* @license MIT
|
|
5
5
|
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
6
|
*/
|
|
7
|
+
import { bufferToTempFile } from '../utils/helpers.js';
|
|
7
8
|
import Converter from './converter.js';
|
|
8
9
|
import ImageConverter from './image_converter.js';
|
|
9
|
-
import
|
|
10
|
+
import Soffice from '../adapters/soffice.js';
|
|
10
11
|
export default class DocumentThumbnailConverter extends Converter {
|
|
11
12
|
async handle({ input, options }) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
const outputBuffer = await this.documentToImage(LibreOfficeFileConverter, input);
|
|
15
|
-
if (options && outputBuffer) {
|
|
13
|
+
const filePath = await this.documentToImage(input);
|
|
14
|
+
if (options && filePath) {
|
|
16
15
|
const converter = new ImageConverter();
|
|
17
16
|
return await converter.handle({
|
|
18
|
-
input:
|
|
17
|
+
input: filePath,
|
|
19
18
|
options,
|
|
20
19
|
});
|
|
21
20
|
}
|
|
22
|
-
return
|
|
21
|
+
return filePath;
|
|
23
22
|
}
|
|
24
|
-
async documentToImage(
|
|
25
|
-
let
|
|
26
|
-
if (this.binPaths && this.binPaths.libreofficePaths) {
|
|
27
|
-
binaryPaths = this.binPaths.libreofficePaths;
|
|
28
|
-
}
|
|
29
|
-
const libreOfficeFileConverter = new LibreOfficeFileConverter({
|
|
30
|
-
childProcessOptions: {
|
|
31
|
-
timeout: 60 * 1000,
|
|
32
|
-
},
|
|
33
|
-
binaryPaths,
|
|
34
|
-
});
|
|
23
|
+
async documentToImage(input) {
|
|
24
|
+
let file = input;
|
|
35
25
|
if (Buffer.isBuffer(input)) {
|
|
36
|
-
|
|
37
|
-
buffer: input,
|
|
38
|
-
input: 'buffer',
|
|
39
|
-
output: 'buffer',
|
|
40
|
-
format: 'jpeg',
|
|
41
|
-
});
|
|
42
|
-
return output;
|
|
26
|
+
file = await bufferToTempFile(input);
|
|
43
27
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
format: 'jpeg',
|
|
50
|
-
});
|
|
51
|
-
return output;
|
|
28
|
+
const soffice = new Soffice(file);
|
|
29
|
+
if (this.binPaths) {
|
|
30
|
+
if (this.binPaths.sofficePath) {
|
|
31
|
+
soffice.setSofficePath(this.binPaths.sofficePath);
|
|
32
|
+
}
|
|
52
33
|
}
|
|
34
|
+
return soffice.convert();
|
|
53
35
|
}
|
|
54
36
|
}
|
|
@@ -9,6 +9,6 @@ import type { Input } from '../types/input.js';
|
|
|
9
9
|
import Converter from './converter.js';
|
|
10
10
|
export default class PdfThumbnailConverter extends Converter {
|
|
11
11
|
handle({ input, options }: ConverterAttributes): Promise<Input>;
|
|
12
|
-
pdfToImage(
|
|
12
|
+
pdfToImage(input: Input): Promise<string>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=pdf_thumbnail_converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pdf_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/pdf_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"pdf_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/pdf_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAG9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAKtC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACpD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;IAc/D,UAAU,CAAC,KAAK,EAAE,KAAK;CAoB9B"}
|
|
@@ -4,17 +4,13 @@
|
|
|
4
4
|
* @license MIT
|
|
5
5
|
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
6
|
*/
|
|
7
|
-
import os from 'node:os';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import { cuid } from '@adonisjs/core/helpers';
|
|
10
7
|
import Converter from './converter.js';
|
|
11
8
|
import ImageConverter from './image_converter.js';
|
|
12
|
-
import
|
|
9
|
+
import Poppler from '../adapters/poppler.js';
|
|
10
|
+
import { bufferToTempFile } from '../utils/helpers.js';
|
|
13
11
|
export default class PdfThumbnailConverter extends Converter {
|
|
14
12
|
async handle({ input, options }) {
|
|
15
|
-
const
|
|
16
|
-
const Poppler = nodePoppler.Poppler;
|
|
17
|
-
const filePath = await this.pdfToImage(Poppler, input);
|
|
13
|
+
const filePath = await this.pdfToImage(input);
|
|
18
14
|
if (options && filePath) {
|
|
19
15
|
const converter = new ImageConverter();
|
|
20
16
|
return await converter.handle({
|
|
@@ -24,19 +20,20 @@ export default class PdfThumbnailConverter extends Converter {
|
|
|
24
20
|
}
|
|
25
21
|
return filePath;
|
|
26
22
|
}
|
|
27
|
-
async pdfToImage(
|
|
28
|
-
let
|
|
29
|
-
if (
|
|
30
|
-
|
|
23
|
+
async pdfToImage(input) {
|
|
24
|
+
let file = input;
|
|
25
|
+
if (Buffer.isBuffer(input)) {
|
|
26
|
+
file = await bufferToTempFile(input);
|
|
31
27
|
}
|
|
32
|
-
const poppler = new Poppler(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
28
|
+
const poppler = new Poppler(file);
|
|
29
|
+
if (this.binPaths) {
|
|
30
|
+
if (this.binPaths.pdftoppmPath) {
|
|
31
|
+
poppler.setPdfToPpmPath(this.binPaths.pdftoppmPath);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return poppler.pdfToPpm({
|
|
35
|
+
page: this.options?.startPage || 1,
|
|
36
|
+
dpi: 300,
|
|
37
|
+
});
|
|
41
38
|
}
|
|
42
39
|
}
|
|
@@ -9,6 +9,6 @@ import type { Input } from '../types/input.js';
|
|
|
9
9
|
import Converter from './converter.js';
|
|
10
10
|
export default class VideoThumbnailConvert extends Converter {
|
|
11
11
|
handle({ input, options }: ConverterAttributes): Promise<Input | undefined>;
|
|
12
|
-
videoToImage(
|
|
12
|
+
videoToImage(input: Input): Promise<string | undefined>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=video_thumbnail_converter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"video_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/video_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"video_thumbnail_converter.d.ts","sourceRoot":"","sources":["../../../src/converters/video_thumbnail_converter.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAKtC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACpD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAc3E,YAAY,CAAC,KAAK,EAAE,KAAK;CAmBhC"}
|
|
@@ -4,16 +4,13 @@
|
|
|
4
4
|
* @license MIT
|
|
5
5
|
* @copyright Jeremy Chaufourier <jeremy@chaufourier.fr>
|
|
6
6
|
*/
|
|
7
|
-
import os from 'node:os';
|
|
8
|
-
import path from 'node:path';
|
|
9
|
-
import { cuid } from '@adonisjs/core/helpers';
|
|
10
7
|
import Converter from './converter.js';
|
|
11
8
|
import ImageConverter from './image_converter.js';
|
|
12
|
-
import { bufferToTempFile
|
|
9
|
+
import { bufferToTempFile } from '../utils/helpers.js';
|
|
10
|
+
import FFmpeg from '../adapters/ffmpeg.js';
|
|
13
11
|
export default class VideoThumbnailConvert extends Converter {
|
|
14
12
|
async handle({ input, options }) {
|
|
15
|
-
const
|
|
16
|
-
const filePath = await this.videoToImage(ffmpeg, input);
|
|
13
|
+
const filePath = await this.videoToImage(input);
|
|
17
14
|
if (options && filePath) {
|
|
18
15
|
const converter = new ImageConverter();
|
|
19
16
|
return converter.handle({
|
|
@@ -25,31 +22,19 @@ export default class VideoThumbnailConvert extends Converter {
|
|
|
25
22
|
return filePath;
|
|
26
23
|
}
|
|
27
24
|
}
|
|
28
|
-
async videoToImage(
|
|
25
|
+
async videoToImage(input) {
|
|
29
26
|
let file = input;
|
|
30
27
|
if (Buffer.isBuffer(input)) {
|
|
31
28
|
file = await bufferToTempFile(input);
|
|
32
29
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
if (this.binPaths) {
|
|
38
|
-
if (this.binPaths.ffmpegPath) {
|
|
39
|
-
ff.setFfmpegPath(this.binPaths.ffmpegPath);
|
|
40
|
-
}
|
|
30
|
+
const ffmpeg = new FFmpeg(file);
|
|
31
|
+
if (this.binPaths) {
|
|
32
|
+
if (this.binPaths.ffmpegPath) {
|
|
33
|
+
ffmpeg.setFfmpegPath(this.binPaths.ffmpegPath);
|
|
41
34
|
}
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
folder,
|
|
46
|
-
})
|
|
47
|
-
.on('end', () => {
|
|
48
|
-
resolve(path.join(folder, filename));
|
|
49
|
-
})
|
|
50
|
-
.on('error', (err) => {
|
|
51
|
-
reject(err);
|
|
52
|
-
});
|
|
35
|
+
}
|
|
36
|
+
return ffmpeg.screenshots({
|
|
37
|
+
time: this.options?.startTime || 2,
|
|
53
38
|
});
|
|
54
39
|
}
|
|
55
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/decorators/attachment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAKtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAYrE,eAAO,MAAM,SAAS,UACb,UAAU,GAAG;IAClB,YAAY,EAAE,4BAA4B,CAAA;CAC3C,
|
|
1
|
+
{"version":3,"file":"attachment.d.ts","sourceRoot":"","sources":["../../../src/decorators/attachment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAKtE,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAA;AAYrE,eAAO,MAAM,SAAS,UACb,UAAU,GAAG;IAClB,YAAY,EAAE,4BAA4B,CAAA;CAC3C,SA0BF,CAAA;AAyDD,eAAO,MAAM,UAAU,aAtBkD,YAAY,cACxD,GAAG,iBAAiB,MAAM,SAqBJ,CAAA;AACnD,eAAO,MAAM,WAAW,aAvBiD,YAAY,cACxD,GAAG,iBAAiB,MAAM,SAiCpD,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD;;GAEG;AACH,MAAM,MAAM,wBAAwB,CAAC,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI;IACxF,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,UAAU,CAAC,EAAE;SAAG,CAAC,IAAI,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC;KAAE,CAAA;IACjE,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,wBAAgB,YAAY,CAAC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACjF,MAAM,EAAE,gBAAgB,CAAC,cAAc,CAAC,GACvC,cAAc,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"define_config.d.ts","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE3F,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAEhD;;GAEG;AACH,MAAM,MAAM,wBAAwB,CAAC,eAAe,SAAS,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI;IACxF,GAAG,CAAC,EAAE,QAAQ,CAAA;IACd,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE;SAAG,CAAC,IAAI,MAAM,eAAe,GAAG,eAAe,CAAC,CAAC,CAAC;KAAE,CAAA;IACjE,KAAK,CAAC,EAAE,KAAK,CAAA;CACd,CAAA;AAED,wBAAgB,YAAY,CAAC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACjF,MAAM,EAAE,gBAAgB,CAAC,cAAc,CAAC,GACvC,cAAc,CAAC,wBAAwB,CAAC,cAAc,CAAC,CAAC,CAiC1D"}
|
|
@@ -13,10 +13,15 @@ export function defineConfig(config) {
|
|
|
13
13
|
for (let converterName of convertersList) {
|
|
14
14
|
const converter = config.converters[converterName];
|
|
15
15
|
const binConfig = config.bin;
|
|
16
|
+
if (converter.converter === undefined) {
|
|
17
|
+
converter.converter = () => import('@jrmc/adonis-attachment/converters/autodetect_converter');
|
|
18
|
+
}
|
|
16
19
|
try {
|
|
17
20
|
const { default: value } = await converter.converter();
|
|
21
|
+
const { converter: _, ...opt } = converter;
|
|
22
|
+
const options = converter.options || opt;
|
|
18
23
|
const Converter = value;
|
|
19
|
-
converters[converterName] = new Converter(
|
|
24
|
+
converters[converterName] = new Converter(options, binConfig);
|
|
20
25
|
}
|
|
21
26
|
catch (error) {
|
|
22
27
|
console.error(`Failed to load converter ${converterName}:`, error);
|
|
@@ -18,6 +18,7 @@ export default class RecordWithAttachment implements RecordWithAttachmentImpleme
|
|
|
18
18
|
enabledRollback: boolean;
|
|
19
19
|
}): Promise<void>;
|
|
20
20
|
preComputeUrl(): Promise<void>;
|
|
21
|
+
setKeyId(): Promise<void>;
|
|
21
22
|
generateVariants(): Promise<void>;
|
|
22
23
|
regenerateVariants(options?: RegenerateOptions): Promise<void>;
|
|
23
24
|
detach(): Promise<PromiseSettledResult<void>[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record_with_attachment.d.ts","sourceRoot":"","sources":["../../../src/services/record_with_attachment.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"record_with_attachment.d.ts","sourceRoot":"","sources":["../../../src/services/record_with_attachment.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,KAAK,EAAE,UAAU,IAAI,cAAc,EAAgB,MAAM,wBAAwB,CAAA;AACxF,OAAO,KAAK,EAAE,oBAAoB,IAAI,kCAAkC,EAAE,MAAM,qBAAqB,CAAA;AACrG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAW/D,MAAM,CAAC,OAAO,OAAO,oBAAqB,YAAW,kCAAkC;;gBAGzE,GAAG,EAAE,iBAAiB;IAWlC;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAiDxB,WAAW,CAAC,OAAO;;KAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB/D,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IA4BzB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IA+BjC,kBAAkB,CAAC,OAAO,GAAE,iBAAsB;IAmClD,MAAM;IA2CN,SAAS;IAkBf,IAAI,GAAG,sBAEN;IAED,cAAc,CAAC,OAAO,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE;CAwEvG"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import logger from '@adonisjs/core/services/logger';
|
|
2
|
+
import encryption from '@adonisjs/core/services/encryption';
|
|
2
3
|
import attachmentManager from '../../services/main.js';
|
|
3
4
|
import { defaultStateAttributeMixin } from '../utils/default_values.js';
|
|
4
5
|
import { Attachment } from '../attachments/attachment.js';
|
|
@@ -100,6 +101,30 @@ export default class RecordWithAttachment {
|
|
|
100
101
|
}
|
|
101
102
|
}));
|
|
102
103
|
}
|
|
104
|
+
async setKeyId() {
|
|
105
|
+
const attachmentAttributeNames = this.#getAttributeNamesOfAttachment();
|
|
106
|
+
await Promise.all(attachmentAttributeNames.map(async (name) => {
|
|
107
|
+
if (this.#row.$attributes[name]) {
|
|
108
|
+
const attachments = this.#getAttachmentsByAttributeName(name);
|
|
109
|
+
for (let i = 0; i < attachments.length; i++) {
|
|
110
|
+
const { disk, folder, meta, rename } = attachments[i].options;
|
|
111
|
+
const model = this.#row.constructor;
|
|
112
|
+
const key = encryption.encrypt({
|
|
113
|
+
model: model.table,
|
|
114
|
+
id: this.#row.$attributes['id'],
|
|
115
|
+
attribute: name,
|
|
116
|
+
options: {
|
|
117
|
+
disk,
|
|
118
|
+
folder,
|
|
119
|
+
meta,
|
|
120
|
+
rename
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
attachments[i].setKeyId(key);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
103
128
|
async generateVariants() {
|
|
104
129
|
/* this.#row.$dirty is not avalable in afterSave hooks */
|
|
105
130
|
const attachmentAttributeNames = this.#row.$attachments.dirtied;
|
|
@@ -31,6 +31,7 @@ export type AttachmentBase = {
|
|
|
31
31
|
getStream(): Promise<NodeJS.ReadableStream>;
|
|
32
32
|
getUrl(): Promise<string>;
|
|
33
33
|
getSignedUrl(signedUrlOptions?: SignedURLOptions): Promise<string>;
|
|
34
|
+
setKeyId(keyId: string): AttachmentBase;
|
|
34
35
|
setOptions(options: LucidOptions): AttachmentBase;
|
|
35
36
|
toObject(): AttachmentBaseAttributes;
|
|
36
37
|
toJSON(): Object;
|
|
@@ -62,6 +63,7 @@ export type LucidOptions = {
|
|
|
62
63
|
serializeAs?: string | null;
|
|
63
64
|
};
|
|
64
65
|
export type AttachmentBaseAttributes = {
|
|
66
|
+
keyId?: string;
|
|
65
67
|
name?: string;
|
|
66
68
|
size: number;
|
|
67
69
|
meta?: Exif;
|