@jrmc/adonis-attachment 4.0.1 → 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.
Files changed (79) hide show
  1. package/README.md +2 -2
  2. package/build/index.d.ts +1 -0
  3. package/build/index.d.ts.map +1 -1
  4. package/build/index.js +1 -0
  5. package/build/providers/attachment_provider.d.ts +7 -0
  6. package/build/providers/attachment_provider.d.ts.map +1 -1
  7. package/build/providers/attachment_provider.js +7 -0
  8. package/build/src/adapters/blurhash.d.ts +6 -0
  9. package/build/src/adapters/blurhash.d.ts.map +1 -1
  10. package/build/src/adapters/blurhash.js +6 -0
  11. package/build/src/adapters/exif.d.ts +1 -1
  12. package/build/src/adapters/exif.d.ts.map +1 -1
  13. package/build/src/adapters/exif.js +41 -11
  14. package/build/src/adapters/ffmpeg.d.ts +19 -0
  15. package/build/src/adapters/ffmpeg.d.ts.map +1 -0
  16. package/build/src/adapters/ffmpeg.js +115 -0
  17. package/build/src/adapters/meta.d.ts +6 -0
  18. package/build/src/adapters/meta.d.ts.map +1 -1
  19. package/build/src/adapters/meta.js +6 -0
  20. package/build/src/adapters/poppler.d.ts +20 -0
  21. package/build/src/adapters/poppler.d.ts.map +1 -0
  22. package/build/src/adapters/poppler.js +116 -0
  23. package/build/src/adapters/soffice.d.ts +14 -0
  24. package/build/src/adapters/soffice.d.ts.map +1 -0
  25. package/build/src/adapters/soffice.js +64 -0
  26. package/build/src/attachment_manager.d.ts +1 -0
  27. package/build/src/attachment_manager.d.ts.map +1 -1
  28. package/build/src/attachment_manager.js +3 -0
  29. package/build/src/attachments/attachment.d.ts.map +1 -1
  30. package/build/src/attachments/attachment.js +1 -0
  31. package/build/src/attachments/attachment_base.d.ts +2 -0
  32. package/build/src/attachments/attachment_base.d.ts.map +1 -1
  33. package/build/src/attachments/attachment_base.js +9 -0
  34. package/build/src/controllers/attachments_controller.d.ts +5 -0
  35. package/build/src/controllers/attachments_controller.d.ts.map +1 -0
  36. package/build/src/controllers/attachments_controller.js +87 -0
  37. package/build/src/converter_manager.d.ts +7 -1
  38. package/build/src/converter_manager.d.ts.map +1 -1
  39. package/build/src/converter_manager.js +7 -5
  40. package/build/src/converters/autodetect_converter.d.ts.map +1 -1
  41. package/build/src/converters/autodetect_converter.js +47 -2
  42. package/build/src/converters/document_thumbnail_converter.d.ts +1 -1
  43. package/build/src/converters/document_thumbnail_converter.d.ts.map +1 -1
  44. package/build/src/converters/document_thumbnail_converter.js +15 -33
  45. package/build/src/converters/pdf_thumbnail_converter.d.ts +1 -1
  46. package/build/src/converters/pdf_thumbnail_converter.d.ts.map +1 -1
  47. package/build/src/converters/pdf_thumbnail_converter.js +17 -24
  48. package/build/src/converters/video_thumbnail_converter.d.ts +1 -1
  49. package/build/src/converters/video_thumbnail_converter.d.ts.map +1 -1
  50. package/build/src/converters/video_thumbnail_converter.js +11 -26
  51. package/build/src/decorators/attachment.d.ts.map +1 -1
  52. package/build/src/define_config.d.ts +1 -0
  53. package/build/src/define_config.d.ts.map +1 -1
  54. package/build/src/define_config.js +6 -1
  55. package/build/src/services/record_with_attachment.d.ts +1 -0
  56. package/build/src/services/record_with_attachment.d.ts.map +1 -1
  57. package/build/src/services/record_with_attachment.js +25 -0
  58. package/build/src/types/attachment.d.ts +2 -0
  59. package/build/src/types/attachment.d.ts.map +1 -1
  60. package/build/src/types/config.d.ts +7 -4
  61. package/build/src/types/config.d.ts.map +1 -1
  62. package/build/src/types/converter.d.ts +2 -0
  63. package/build/src/types/converter.d.ts.map +1 -1
  64. package/build/src/types/index.d.ts +1 -0
  65. package/build/src/types/index.d.ts.map +1 -1
  66. package/build/src/types/index.js +1 -0
  67. package/build/src/types/input.d.ts +5 -0
  68. package/build/src/types/input.d.ts.map +1 -1
  69. package/build/src/types/metadata.d.ts +18 -0
  70. package/build/src/types/metadata.d.ts.map +1 -0
  71. package/build/src/types/metadata.js +1 -0
  72. package/build/src/utils/default_values.js +1 -1
  73. package/build/src/utils/helpers.d.ts +1 -0
  74. package/build/src/utils/helpers.d.ts.map +1 -1
  75. package/build/src/utils/helpers.js +6 -0
  76. package/build/src/utils/hooks.d.ts.map +1 -1
  77. package/build/src/utils/hooks.js +1 -0
  78. package/build/tsconfig.tsbuildinfo +1 -1
  79. package/package.json +11 -3
@@ -120,6 +120,7 @@ export class Attachment extends AttachmentBase {
120
120
  }
121
121
  toJSON() {
122
122
  const data = {
123
+ keyId: this.getKeyId(),
123
124
  name: this.name,
124
125
  originalName: this.originalName,
125
126
  size: this.size,
@@ -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;IAKb,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,UAAU,CAAC,OAAO,EAAE,YAAY;IAQhC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ;IAwB5B;;OAEG;IAEH,QAAQ,IAAI,wBAAwB;IAWpC,MAAM,IAAI,MAAM;CAUjB"}
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,5 @@
1
+ import type { HttpContext } from '@adonisjs/core/http';
2
+ export default class AttachmentsController {
3
+ handle({ request, response }: HttpContext): Promise<void>;
4
+ }
5
+ //# sourceMappingURL=attachments_controller.d.ts.map
@@ -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,EAAa,6BAA6B,EAAE,MAAM,sBAAsB,CAAA;AAWpF,qBAAa,gBAAgB;;gBAQf,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,6BAA6B;IAOhF,GAAG;CAmIV"}
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 this.#generate({
33
+ const variant = await ConverterManager.generate({
35
34
  key,
36
35
  attachment,
37
36
  converter
38
37
  });
39
- variants.push(variant);
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 #generate({ key, attachment, converter }) {
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;AAItC,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,SAAS;IAClD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;CAqBlF"}
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?.mime.includes('video')) {
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
- converter = new ImageConverter(options, this.binPaths);
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(LibreOfficeFileConverter: any, input: Input): Promise<any>;
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;AAE9C,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;IAgB/D,eAAe,CAAC,wBAAwB,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK;CAiClE"}
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 { use } from '../utils/helpers.js';
10
+ import Soffice from '../adapters/soffice.js';
10
11
  export default class DocumentThumbnailConverter extends Converter {
11
12
  async handle({ input, options }) {
12
- const lib = await use('libreoffice-file-converter');
13
- const LibreOfficeFileConverter = lib.LibreOfficeFileConverter;
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: outputBuffer,
17
+ input: filePath,
19
18
  options,
20
19
  });
21
20
  }
22
- return outputBuffer;
21
+ return filePath;
23
22
  }
24
- async documentToImage(LibreOfficeFileConverter, input) {
25
- let binaryPaths = undefined;
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
- const output = await libreOfficeFileConverter.convert({
37
- buffer: input,
38
- input: 'buffer',
39
- output: 'buffer',
40
- format: 'jpeg',
41
- });
42
- return output;
26
+ file = await bufferToTempFile(input);
43
27
  }
44
- else {
45
- const output = await libreOfficeFileConverter.convert({
46
- inputPath: input,
47
- input: 'file',
48
- output: 'buffer',
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(Poppler: any, input: Input): Promise<string>;
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;AAK9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAItC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACpD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,CAAC;IAgB/D,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK;CA0B5C"}
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 { use } from '../utils/helpers.js';
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 nodePoppler = await use('node-poppler');
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,23 +20,20 @@ export default class PdfThumbnailConverter extends Converter {
24
20
  }
25
21
  return filePath;
26
22
  }
27
- async pdfToImage(Poppler, input) {
28
- let binPath = null;
29
- if (this.binPaths && this.binPaths.pdftocairoBasePath) {
30
- binPath = this.binPaths.pdftocairoBasePath;
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(binPath);
33
- const pdfInfo = await poppler.pdfInfo(input);
34
- const pagesMatch = pdfInfo.match(/Pages:\s*(\d+)/);
35
- const pageCount = pagesMatch ? parseInt(pagesMatch[1]) : 1;
36
- const pageNumberFormat = '0'.repeat(String(pageCount).length - 1);
37
- const options = {
38
- // firstPageToConvert: 1,
39
- lastPageToConvert: 1,
40
- jpegFile: true,
41
- };
42
- const filePath = path.join(os.tmpdir(), cuid());
43
- await poppler.pdfToCairo(input, filePath, options);
44
- return `${filePath}-${pageNumberFormat}1.jpg`;
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
+ });
45
38
  }
46
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(ffmpeg: Function, input: Input): Promise<string | undefined>;
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;AAK9C,OAAO,SAAS,MAAM,gBAAgB,CAAA;AAItC,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACpD,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC;IAe3E,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK;CAgClD"}
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, use } from '../utils/helpers.js';
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 ffmpeg = await use('fluent-ffmpeg');
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(ffmpeg, input) {
25
+ async videoToImage(input) {
29
26
  let file = input;
30
27
  if (Buffer.isBuffer(input)) {
31
28
  file = await bufferToTempFile(input);
32
29
  }
33
- return new Promise((resolve, reject) => {
34
- const folder = os.tmpdir();
35
- const filename = `${cuid()}.png`;
36
- const ff = ffmpeg(file);
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
- ff.screenshots({
43
- count: 1,
44
- filename,
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,SA2BF,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
+ {"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"}
@@ -15,6 +15,7 @@ export type ResolvedAttachmentConfig<KnownConverters extends Record<string, Conv
15
15
  meta?: boolean;
16
16
  rename?: boolean;
17
17
  preComputeUrl?: boolean;
18
+ timeout?: number;
18
19
  converters?: {
19
20
  [K in keyof KnownConverters]: KnownConverters[K];
20
21
  };
@@ -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,CA0B1D"}
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(converter.options, binConfig);
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":"AAAA,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;AAU/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,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
+ {"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;