@hed-hog/core 0.0.401 → 0.0.402

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 (106) hide show
  1. package/dist/access-log/access-log.interceptor.d.ts +10 -0
  2. package/dist/access-log/access-log.interceptor.d.ts.map +1 -1
  3. package/dist/access-log/access-log.interceptor.js +15 -1
  4. package/dist/access-log/access-log.interceptor.js.map +1 -1
  5. package/dist/file/file-upload-ticket.service.d.ts +1 -1
  6. package/dist/file/file.controller.d.ts +3 -3
  7. package/dist/file/file.service.d.ts +121 -12
  8. package/dist/file/file.service.d.ts.map +1 -1
  9. package/dist/file/file.service.js +245 -3
  10. package/dist/file/file.service.js.map +1 -1
  11. package/dist/file/provider/abstract.provider.d.ts +33 -0
  12. package/dist/file/provider/abstract.provider.d.ts.map +1 -1
  13. package/dist/file/provider/abstract.provider.js +9 -0
  14. package/dist/file/provider/abstract.provider.js.map +1 -1
  15. package/dist/file/provider/s3-multipart.util.d.ts +17 -0
  16. package/dist/file/provider/s3-multipart.util.d.ts.map +1 -0
  17. package/dist/file/provider/s3-multipart.util.js +88 -0
  18. package/dist/file/provider/s3-multipart.util.js.map +1 -0
  19. package/dist/file/provider/s3.provider.d.ts +9 -1
  20. package/dist/file/provider/s3.provider.d.ts.map +1 -1
  21. package/dist/file/provider/s3.provider.js +16 -0
  22. package/dist/file/provider/s3.provider.js.map +1 -1
  23. package/dist/file/provider/spaces.provider.d.ts +10 -1
  24. package/dist/file/provider/spaces.provider.d.ts.map +1 -1
  25. package/dist/file/provider/spaces.provider.js +17 -0
  26. package/dist/file/provider/spaces.provider.js.map +1 -1
  27. package/dist/integration-profile/integration-profile.controller.d.ts +1 -0
  28. package/dist/integration-profile/integration-profile.controller.d.ts.map +1 -1
  29. package/dist/integration-profile/integration-profile.secrets.d.ts.map +1 -1
  30. package/dist/integration-profile/integration-profile.secrets.js +7 -2
  31. package/dist/integration-profile/integration-profile.secrets.js.map +1 -1
  32. package/dist/integration-profile/integration-profile.service.d.ts +1 -0
  33. package/dist/integration-profile/integration-profile.service.d.ts.map +1 -1
  34. package/dist/integration-profile/integration-profile.service.js +3 -3
  35. package/dist/integration-profile/integration-profile.service.js.map +1 -1
  36. package/dist/integration-profile/testers/http-probe.d.ts.map +1 -1
  37. package/dist/integration-profile/testers/http-probe.js +5 -3
  38. package/dist/integration-profile/testers/http-probe.js.map +1 -1
  39. package/dist/integration-profile/testers/integration-tester.types.d.ts +5 -0
  40. package/dist/integration-profile/testers/integration-tester.types.d.ts.map +1 -1
  41. package/dist/mail/mail.service.d.ts.map +1 -1
  42. package/dist/mail/mail.service.js +16 -1
  43. package/dist/mail/mail.service.js.map +1 -1
  44. package/dist/mcp/mcp-server.service.d.ts.map +1 -1
  45. package/dist/mcp/mcp-server.service.js +10 -1
  46. package/dist/mcp/mcp-server.service.js.map +1 -1
  47. package/dist/pdf/document/pdf-document.css.d.ts.map +1 -1
  48. package/dist/pdf/document/pdf-document.css.js +88 -0
  49. package/dist/pdf/document/pdf-document.css.js.map +1 -1
  50. package/dist/pdf/document/pdf-document.renderer.d.ts.map +1 -1
  51. package/dist/pdf/document/pdf-document.renderer.js +73 -0
  52. package/dist/pdf/document/pdf-document.renderer.js.map +1 -1
  53. package/dist/pdf/document/pdf-document.types.d.ts +56 -0
  54. package/dist/pdf/document/pdf-document.types.d.ts.map +1 -1
  55. package/dist/pdf/pdf.service.d.ts +6 -0
  56. package/dist/pdf/pdf.service.d.ts.map +1 -1
  57. package/dist/pdf/pdf.service.js +3 -0
  58. package/dist/pdf/pdf.service.js.map +1 -1
  59. package/dist/setting/setting.service.d.ts.map +1 -1
  60. package/dist/setting/setting.service.js +3 -0
  61. package/dist/setting/setting.service.js.map +1 -1
  62. package/dist/task/task.service.d.ts +6 -0
  63. package/dist/task/task.service.d.ts.map +1 -1
  64. package/dist/task/task.service.js +44 -13
  65. package/dist/task/task.service.js.map +1 -1
  66. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts +35 -2
  67. package/dist/whatsapp-sender/whatsapp-sender.service.d.ts.map +1 -1
  68. package/dist/whatsapp-sender/whatsapp-sender.service.js +83 -21
  69. package/dist/whatsapp-sender/whatsapp-sender.service.js.map +1 -1
  70. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.test.tsx.ejs +85 -2
  71. package/hedhog/frontend/app/configurations/[slug]/components/setting-field.tsx.ejs +576 -491
  72. package/hedhog/frontend/app/users/simulate-access-dialog.test.tsx.ejs +29 -50
  73. package/hedhog/frontend/app/users/simulate-access-dialog.tsx.ejs +146 -50
  74. package/hedhog/frontend/messages/en.json +46 -20
  75. package/hedhog/frontend/messages/pt.json +46 -20
  76. package/hedhog/table/file.yaml +3 -1
  77. package/package.json +4 -4
  78. package/src/access-log/access-log.interceptor.spec.ts +50 -0
  79. package/src/access-log/access-log.interceptor.ts +18 -0
  80. package/src/file/file-direct-upload.spec.ts +344 -0
  81. package/src/file/file.service.ts +363 -2
  82. package/src/file/provider/abstract.provider.ts +57 -0
  83. package/src/file/provider/s3-multipart.spec.ts +123 -0
  84. package/src/file/provider/s3-multipart.util.ts +126 -0
  85. package/src/file/provider/s3.provider.ts +65 -1
  86. package/src/file/provider/spaces.provider.ts +67 -1
  87. package/src/integration-profile/integration-profile.secrets.ts +7 -2
  88. package/src/integration-profile/integration-profile.service.ts +1 -0
  89. package/src/integration-profile/testers/http-probe.ts +5 -3
  90. package/src/integration-profile/testers/integration-tester.types.ts +5 -0
  91. package/src/integration-profile/testers/oauth.testers.spec.ts +13 -0
  92. package/src/integration-profile/testers/tester-coverage.spec.ts +2 -0
  93. package/src/mail/mail.service.spec.ts +25 -0
  94. package/src/mail/mail.service.ts +18 -1
  95. package/src/mcp/mcp-server.service.spec.ts +16 -0
  96. package/src/mcp/mcp-server.service.ts +10 -1
  97. package/src/pdf/document/pdf-document.css.ts +88 -0
  98. package/src/pdf/document/pdf-document.renderer.spec.ts +43 -0
  99. package/src/pdf/document/pdf-document.renderer.ts +102 -0
  100. package/src/pdf/document/pdf-document.types.ts +52 -0
  101. package/src/pdf/pdf.service.ts +11 -0
  102. package/src/setting/setting.service.ts +3 -0
  103. package/src/task/task.service.spec.ts +77 -1
  104. package/src/task/task.service.ts +58 -14
  105. package/src/whatsapp-sender/whatsapp-sender.service.spec.ts +191 -1
  106. package/src/whatsapp-sender/whatsapp-sender.service.ts +122 -14
@@ -1,6 +1,16 @@
1
1
  import { CallHandler, ExecutionContext, NestInterceptor } from '@nestjs/common';
2
2
  import { Observable } from 'rxjs';
3
3
  import { AccessLogService } from './access-log.service';
4
+ /**
5
+ * Metadado (handler ou classe) que tira a rota do access log.
6
+ *
7
+ * Existe para superficies cujo valor depende de NAO saber quem chamou — o canal
8
+ * de denuncias da library integrity: uma linha com IP, user agent e horario de
9
+ * `POST /integrity/public/reports` identificaria o denunciante. Quem usa aplica
10
+ * `SetMetadata('skipAccessLog', true)` direto, sem importar daqui, para uma
11
+ * library nao exigir esta versao do core (um core antigo apenas continua logando).
12
+ */
13
+ export declare const SKIP_ACCESS_LOG_KEY = "skipAccessLog";
4
14
  export declare class AccessLogInterceptor implements NestInterceptor {
5
15
  private readonly accessLogService;
6
16
  constructor(accessLogService: AccessLogService);
@@ -1 +1 @@
1
- {"version":3,"file":"access-log.interceptor.d.ts","sourceRoot":"","sources":["../../src/access-log/access-log.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBACa,oBAAqB,YAAW,eAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,gBAAgB;IAE/D,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;CA8BzE"}
1
+ {"version":3,"file":"access-log.interceptor.d.ts","sourceRoot":"","sources":["../../src/access-log/access-log.interceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,gBAAgB,EAEhB,eAAe,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,UAAU,EAAO,MAAM,MAAM,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;;;;;;GAQG;AACH,eAAO,MAAM,mBAAmB,kBAAkB,CAAC;AAEnD,qBACa,oBAAqB,YAAW,eAAe;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBAAhB,gBAAgB,EAAE,gBAAgB;IAE/D,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC;CAqCzE"}
@@ -9,10 +9,20 @@ var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.AccessLogInterceptor = void 0;
12
+ exports.AccessLogInterceptor = exports.SKIP_ACCESS_LOG_KEY = void 0;
13
13
  const common_1 = require("@nestjs/common");
14
14
  const rxjs_1 = require("rxjs");
15
15
  const access_log_service_1 = require("./access-log.service");
16
+ /**
17
+ * Metadado (handler ou classe) que tira a rota do access log.
18
+ *
19
+ * Existe para superficies cujo valor depende de NAO saber quem chamou — o canal
20
+ * de denuncias da library integrity: uma linha com IP, user agent e horario de
21
+ * `POST /integrity/public/reports` identificaria o denunciante. Quem usa aplica
22
+ * `SetMetadata('skipAccessLog', true)` direto, sem importar daqui, para uma
23
+ * library nao exigir esta versao do core (um core antigo apenas continua logando).
24
+ */
25
+ exports.SKIP_ACCESS_LOG_KEY = 'skipAccessLog';
16
26
  let AccessLogInterceptor = class AccessLogInterceptor {
17
27
  constructor(accessLogService) {
18
28
  this.accessLogService = accessLogService;
@@ -27,6 +37,10 @@ let AccessLogInterceptor = class AccessLogInterceptor {
27
37
  if (path.startsWith('/mcp')) {
28
38
  return next.handle();
29
39
  }
40
+ if (Reflect.getMetadata(exports.SKIP_ACCESS_LOG_KEY, context.getHandler()) === true ||
41
+ Reflect.getMetadata(exports.SKIP_ACCESS_LOG_KEY, context.getClass()) === true) {
42
+ return next.handle();
43
+ }
30
44
  return next.handle().pipe((0, rxjs_1.tap)(() => {
31
45
  var _a, _b, _c, _d, _e, _f;
32
46
  const userId = (_a = request.auth) === null || _a === void 0 ? void 0 : _a.sub;
@@ -1 +1 @@
1
- {"version":3,"file":"access-log.interceptor.js","sourceRoot":"","sources":["../../src/access-log/access-log.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,+BAAuC;AACvC,6DAAwD;AAGjD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAG,CAAC;IAEnE,SAAS,CAAC,OAAyB,EAAE,IAAiB;;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,GAAW,MAAA,OAAO,CAAC,GAAG,mCAAI,EAAE,CAAC;QAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,UAAG,EAAC,GAAG,EAAE;;YACP,MAAM,MAAM,GAAuB,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,CAAC;YACrD,sEAAsE;YACtE,8DAA8D;YAC9D,MAAM,kBAAkB,GACtB,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,MAAK,IAAI,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,kFAAkF;YAClF,0EAA0E;YAC1E,0DAA0D;YAC1D,MAAM,EAAE,GAAW,MAAA,OAAO,CAAC,EAAE,mCAAI,EAAE,CAAC;YACpC,MAAM,SAAS,GAAW,MAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAY,mCAAI,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAW,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;YAE5C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChG,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAjCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAEoC,qCAAgB;GADpD,oBAAoB,CAiChC"}
1
+ {"version":3,"file":"access-log.interceptor.js","sourceRoot":"","sources":["../../src/access-log/access-log.interceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AACxB,+BAAuC;AACvC,6DAAwD;AAExD;;;;;;;;GAQG;AACU,QAAA,mBAAmB,GAAG,eAAe,CAAC;AAG5C,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAA6B,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;IAAG,CAAC;IAEnE,SAAS,CAAC,OAAyB,EAAE,IAAiB;;QACpD,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;QACpD,MAAM,IAAI,GAAW,MAAA,OAAO,CAAC,GAAG,mCAAI,EAAE,CAAC;QAEvC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,IACE,OAAO,CAAC,WAAW,CAAC,2BAAmB,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,IAAI;YACvE,OAAO,CAAC,WAAW,CAAC,2BAAmB,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,EACrE,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CACvB,IAAA,UAAG,EAAC,GAAG,EAAE;;YACP,MAAM,MAAM,GAAuB,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,CAAC;YACrD,sEAAsE;YACtE,8DAA8D;YAC9D,MAAM,kBAAkB,GACtB,CAAA,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,MAAK,IAAI,CAAC,CAAC,CAAC,MAAA,OAAO,CAAC,IAAI,0CAAE,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7D,kFAAkF;YAClF,0EAA0E;YAC1E,0DAA0D;YAC1D,MAAM,EAAE,GAAW,MAAA,OAAO,CAAC,EAAE,mCAAI,EAAE,CAAC;YACpC,MAAM,SAAS,GAAW,MAAC,OAAO,CAAC,OAAO,CAAC,YAAY,CAAY,mCAAI,EAAE,CAAC;YAC1E,MAAM,MAAM,GAAW,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;YAE5C,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChG,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF,CAAA;AAxCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAEoC,qCAAgB;GADpD,oBAAoB,CAwChC"}
@@ -152,7 +152,7 @@ export declare class FileUploadTicketService {
152
152
  provider_id: number;
153
153
  location: string;
154
154
  mimetype_id: number;
155
- size: number;
155
+ size: bigint;
156
156
  is_private: boolean;
157
157
  created_by_user_id: number | null;
158
158
  }>;
@@ -27,7 +27,7 @@ export declare class FileController {
27
27
  provider_id: number;
28
28
  location: string;
29
29
  mimetype_id: number;
30
- size: number;
30
+ size: bigint;
31
31
  is_private: boolean;
32
32
  created_by_user_id: number | null;
33
33
  }>;
@@ -54,7 +54,7 @@ export declare class FileController {
54
54
  uploadId: number;
55
55
  fileId: number;
56
56
  filename: string;
57
- size: number;
57
+ size: bigint;
58
58
  }>;
59
59
  download(token: string, res: Response, locale: string): Promise<void>;
60
60
  /**
@@ -73,7 +73,7 @@ export declare class FileController {
73
73
  provider_id: number;
74
74
  location: string;
75
75
  mimetype_id: number;
76
- size: number;
76
+ size: bigint;
77
77
  is_private: boolean;
78
78
  created_by_user_id: number | null;
79
79
  }>;
@@ -6,7 +6,41 @@ import type { Request } from 'express';
6
6
  import { SettingService } from '../setting/setting.service';
7
7
  import { DeleteDTO } from './dto/delete.dto';
8
8
  import { ImageOptimizationService } from './image-optimization.service';
9
- import { AbstractProvider } from './provider/abstract.provider';
9
+ import { AbstractProvider, MultipartUploadPart } from './provider/abstract.provider';
10
+ /** Upload direto em partes: mínimo de 16 MiB por parte e até 9000 partes (regra do Studio). */
11
+ export declare const DIRECT_UPLOAD_MIN_PART_BYTES: number;
12
+ export declare const DIRECT_UPLOAD_MAX_PARTS = 9000;
13
+ /** Validade do token e das URLs de parte: um vídeo grande em conexão lenta leva horas. */
14
+ export declare const DIRECT_UPLOAD_DEFAULT_TTL_SECONDS = 86400;
15
+ export type DirectUploadFileInfo = {
16
+ originalname: string;
17
+ mimetype: string;
18
+ size: number;
19
+ isPrivate?: boolean;
20
+ createdByUserId?: number | null;
21
+ /** Mesmo sentido do `uploadFromPath`: o chamador já conferiu o tipo pelas regras dele. */
22
+ skipMimeValidation?: boolean;
23
+ /**
24
+ * O chamador já conferiu o tamanho pelas regras dele: pula a `storage-max-size`. O teto
25
+ * da coluna `file.size` continua valendo.
26
+ */
27
+ skipSizeValidation?: boolean;
28
+ };
29
+ export type CompleteDirectUploadInput = DirectUploadFileInfo & {
30
+ key: string;
31
+ uploadId: string;
32
+ destination: string;
33
+ parts: MultipartUploadPart[];
34
+ /**
35
+ * Confere os primeiros `bytes` do objeto gravado (ex.: sniff do tipo real). Se `check`
36
+ * lançar, o objeto é apagado e o erro sobe como veio; se devolver um mimetype, é ele
37
+ * que vai para a linha `file` (o tipo real, no lugar do declarado).
38
+ */
39
+ verifyHead?: {
40
+ bytes: number;
41
+ check: (head: Buffer) => string | void | Promise<string | void>;
42
+ };
43
+ };
10
44
  /** Raw `?w=`/`?f=`/`?q=` query values for the public image endpoint. */
11
45
  export type ImageVariantRequest = {
12
46
  width?: number | string;
@@ -47,7 +81,7 @@ export declare class FileService implements OnModuleInit {
47
81
  provider_id: number;
48
82
  location: string;
49
83
  mimetype_id: number;
50
- size: number;
84
+ size: bigint;
51
85
  is_private: boolean;
52
86
  created_by_user_id: number | null;
53
87
  }>;
@@ -81,12 +115,12 @@ export declare class FileService implements OnModuleInit {
81
115
  provider_id: number;
82
116
  location: string;
83
117
  mimetype_id: number;
84
- size: number;
118
+ size: bigint;
85
119
  is_private: boolean;
86
120
  created_by_user_id: number | null;
87
121
  };
88
122
  stream: any;
89
- size: number;
123
+ size: number | bigint;
90
124
  }>;
91
125
  openReadStreamWithRange(fileId: number, start?: number, end?: number): Promise<{
92
126
  file: {
@@ -105,7 +139,7 @@ export declare class FileService implements OnModuleInit {
105
139
  provider_id: number;
106
140
  location: string;
107
141
  mimetype_id: number;
108
- size: number;
142
+ size: bigint;
109
143
  is_private: boolean;
110
144
  created_by_user_id: number | null;
111
145
  };
@@ -135,7 +169,7 @@ export declare class FileService implements OnModuleInit {
135
169
  provider_id: number;
136
170
  location: string;
137
171
  mimetype_id: number;
138
- size: number;
172
+ size: bigint;
139
173
  is_private: boolean;
140
174
  created_by_user_id: number | null;
141
175
  };
@@ -159,7 +193,7 @@ export declare class FileService implements OnModuleInit {
159
193
  provider_id: number;
160
194
  location: string;
161
195
  mimetype_id: number;
162
- size: number;
196
+ size: bigint;
163
197
  is_private: boolean;
164
198
  created_by_user_id: number | null;
165
199
  };
@@ -199,7 +233,7 @@ export declare class FileService implements OnModuleInit {
199
233
  provider_id: number;
200
234
  location: string;
201
235
  mimetype_id: number;
202
- size: number;
236
+ size: bigint;
203
237
  is_private: boolean;
204
238
  created_by_user_id: number | null;
205
239
  }>;
@@ -227,10 +261,69 @@ export declare class FileService implements OnModuleInit {
227
261
  provider_id: number;
228
262
  location: string;
229
263
  mimetype_id: number;
230
- size: number;
264
+ size: bigint;
265
+ is_private: boolean;
266
+ created_by_user_id: number | null;
267
+ }>;
268
+ /**
269
+ * O storage ativo aceita upload direto em partes assinadas (S3 e Spaces)? Sem provider
270
+ * configurado, ou com um que não implementa, é `false` — quem oferece o caminho cai no
271
+ * upload pela API.
272
+ */
273
+ supportsDirectUpload(): Promise<boolean>;
274
+ private getDirectUploadProvider;
275
+ /** `key` gravada pelo start: `${destination}/${uuid.ext}`, sem subpasta extra. */
276
+ private assertDirectUploadKey;
277
+ /**
278
+ * Abre um upload multipart direto no storage. A chave segue o mesmo formato que o
279
+ * `uploadFromPath` grava (`file.location` = destination, `file.path` = uuid.ext do
280
+ * `getFilename` do provider), então o arquivo final é servido como qualquer outro.
281
+ *
282
+ * Nada vai para o banco aqui: o estado entre as chamadas fica com quem chamou (token
283
+ * assinado, ver `signDirectUploadToken`) e a linha `file` só nasce no complete.
284
+ * Tamanho da parte com a regra do Studio: no mínimo 16 MiB e no máximo 9000 partes.
285
+ */
286
+ startDirectUpload(destination: string, info: DirectUploadFileInfo): Promise<{
287
+ key: string;
288
+ uploadId: string;
289
+ partSize: number;
290
+ partCount: number;
291
+ }>;
292
+ /** URLs assinadas de PUT para as partes pedidas (1-based, sem repetir). */
293
+ signDirectUploadParts(key: string, uploadId: string, partNumbers: number[], ttlSeconds?: number): Promise<{
294
+ partNumber: number;
295
+ url: string;
296
+ }[]>;
297
+ /** Aborta o multipart (as partes já enviadas somem do bucket). Upload já fechado não é erro. */
298
+ abortDirectUpload(key: string, uploadId: string): Promise<void>;
299
+ /**
300
+ * Fecha o multipart e registra o arquivo. Confere o que o storage gravou antes de criar
301
+ * a linha — tamanho pelo HeadObject (tem que bater com o declarado no start), teto
302
+ * `storage-max-size`, allowlist `storage-accept-mimetype` e, quando pedido, os primeiros
303
+ * bytes (`verifyHead`) — e apaga o objeto quando algo não confere: um upload recusado
304
+ * não deixa blob órfão no bucket.
305
+ */
306
+ completeDirectUpload(input: CompleteDirectUploadInput): Promise<{
307
+ id: number;
308
+ path: string;
309
+ created_at: Date;
310
+ updated_at: Date;
311
+ filename: string;
312
+ provider_id: number;
313
+ location: string;
314
+ mimetype_id: number;
315
+ size: bigint;
231
316
  is_private: boolean;
232
317
  created_by_user_id: number | null;
233
318
  }>;
319
+ /**
320
+ * Token opaco que carrega o estado de um upload direto entre as chamadas (sem tabela):
321
+ * JWT HS256 com o JWT_SECRET da API e o tipo `file-direct-upload`, como o token do
322
+ * `file-upload-ticket`. Quem chama põe nas claims o que precisa amarrar (marca, usuário).
323
+ */
324
+ signDirectUploadToken(claims: Record<string, unknown>, ttlSeconds?: number): string;
325
+ /** Claims do token de upload direto; assinatura inválida, expirado ou de outro tipo = 400. */
326
+ readDirectUploadToken<T extends Record<string, unknown>>(token: string): T;
234
327
  /**
235
328
  * Mimetypes de imagem que `optimizeBuffer` devolve intactos por decisão de projeto
236
329
  * (vetor não vira bitmap, GIF animado não vira quadro único). Enfileirá-los para
@@ -370,7 +463,7 @@ export declare class FileService implements OnModuleInit {
370
463
  provider_id: number;
371
464
  location: string;
372
465
  mimetype_id: number;
373
- size: number;
466
+ size: bigint;
374
467
  is_private: boolean;
375
468
  created_by_user_id: number | null;
376
469
  }>;
@@ -383,7 +476,7 @@ export declare class FileService implements OnModuleInit {
383
476
  provider_id: number;
384
477
  location: string;
385
478
  mimetype_id: number;
386
- size: number;
479
+ size: bigint;
387
480
  is_private: boolean;
388
481
  created_by_user_id: number | null;
389
482
  }>;
@@ -414,7 +507,7 @@ export declare class FileService implements OnModuleInit {
414
507
  provider_id: number;
415
508
  location: string;
416
509
  mimetype_id: number;
417
- size: number;
510
+ size: bigint;
418
511
  is_private: boolean;
419
512
  created_by_user_id: number | null;
420
513
  }>;
@@ -592,6 +685,22 @@ export declare class FileService implements OnModuleInit {
592
685
  expiresInSeconds?: number;
593
686
  downloadFileName?: string;
594
687
  }): Promise<string>;
688
+ /**
689
+ * Apaga um objeto de bucket avulso, com as credenciais de quem o configurou.
690
+ *
691
+ * Mesmo motivo do `headS3Object` e do `signS3Object`: o bucket e de outra
692
+ * library (o Studio guarda os brutos no perfil de armazenamento dele), e nao o
693
+ * destino ativo do core. O S3 responde 204 tambem para key inexistente, entao
694
+ * apagar duas vezes nao e erro.
695
+ */
696
+ deleteS3Object(params: {
697
+ accessKeyId: string;
698
+ secretAccessKey: string;
699
+ sessionToken?: string;
700
+ region: string;
701
+ bucket: string;
702
+ key: string;
703
+ }): Promise<void>;
595
704
  headS3Bucket(params: {
596
705
  accessKeyId: string;
597
706
  secretAccessKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/file/file.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.service.d.ts","sourceRoot":"","sources":["../../src/file/file.service.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _ar
34
34
  var _a;
35
35
  var FileService_1;
36
36
  Object.defineProperty(exports, "__esModule", { value: true });
37
- exports.FileService = void 0;
37
+ exports.FileService = exports.DIRECT_UPLOAD_DEFAULT_TTL_SECONDS = exports.DIRECT_UPLOAD_MAX_PARTS = exports.DIRECT_UPLOAD_MIN_PART_BYTES = void 0;
38
38
  const client_s3_1 = require("@aws-sdk/client-s3");
39
39
  const s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
40
40
  const client_lambda_1 = require("@aws-sdk/client-lambda");
@@ -67,6 +67,17 @@ const STORAGE_UNAVAILABLE_CODES = ['SlowDown', 'ServiceUnavailable', 'InternalEr
67
67
  * A janela curta mantém a troca de perfil de storage praticamente imediata.
68
68
  */
69
69
  const PROVIDER_CACHE_TTL_MS = Math.max(0, Number((_a = process.env.FILE_PROVIDER_CACHE_TTL_MS) !== null && _a !== void 0 ? _a : 30000));
70
+ /** Upload direto em partes: mínimo de 16 MiB por parte e até 9000 partes (regra do Studio). */
71
+ exports.DIRECT_UPLOAD_MIN_PART_BYTES = 16 * 1024 * 1024;
72
+ exports.DIRECT_UPLOAD_MAX_PARTS = 9000;
73
+ /** Validade do token e das URLs de parte: um vídeo grande em conexão lenta leva horas. */
74
+ exports.DIRECT_UPLOAD_DEFAULT_TTL_SECONDS = 86400;
75
+ const DIRECT_UPLOAD_TOKEN_TYPE = 'file-direct-upload';
76
+ /**
77
+ * `file.size` é BIGINT no banco, e o PrismaService o devolve como number: o teto real é o
78
+ * maior inteiro exato de um number (~9 PB).
79
+ */
80
+ const FILE_SIZE_COLUMN_MAX = Number.MAX_SAFE_INTEGER;
70
81
  let FileService = FileService_1 = class FileService {
71
82
  resolveProviderPath(file) {
72
83
  // Supports legacy basename-only values while prioritizing full provider keys.
@@ -307,7 +318,7 @@ let FileService = FileService_1 = class FileService {
307
318
  throw new common_1.NotFoundException(`File not found: ${fileId}`);
308
319
  const provider = await this.getProvider();
309
320
  const providerPath = this.resolveProviderPath(file);
310
- const totalSize = (_a = file.size) !== null && _a !== void 0 ? _a : 0;
321
+ const totalSize = Number((_a = file.size) !== null && _a !== void 0 ? _a : 0);
311
322
  const resolvedStart = start !== null && start !== void 0 ? start : 0;
312
323
  const resolvedEnd = end !== undefined ? end : totalSize > 0 ? totalSize - 1 : undefined;
313
324
  const hasRange = start !== undefined;
@@ -558,6 +569,222 @@ let FileService = FileService_1 = class FileService {
558
569
  });
559
570
  return file;
560
571
  }
572
+ /**
573
+ * O storage ativo aceita upload direto em partes assinadas (S3 e Spaces)? Sem provider
574
+ * configurado, ou com um que não implementa, é `false` — quem oferece o caminho cai no
575
+ * upload pela API.
576
+ */
577
+ async supportsDirectUpload() {
578
+ try {
579
+ return (0, abstract_provider_1.supportsDirectUpload)(await this.getProvider());
580
+ }
581
+ catch (_a) {
582
+ return false;
583
+ }
584
+ }
585
+ async getDirectUploadProvider() {
586
+ const provider = await this.getProvider();
587
+ if (!(0, abstract_provider_1.supportsDirectUpload)(provider)) {
588
+ throw new common_1.ConflictException('The file storage does not support direct uploads');
589
+ }
590
+ return provider;
591
+ }
592
+ /** `key` gravada pelo start: `${destination}/${uuid.ext}`, sem subpasta extra. */
593
+ assertDirectUploadKey(key, destination) {
594
+ const prefix = `${destination}/`;
595
+ const storedFilename = typeof key === 'string' && key.startsWith(prefix)
596
+ ? key.slice(prefix.length)
597
+ : '';
598
+ if (!storedFilename || storedFilename.includes('/')) {
599
+ throw new common_1.BadRequestException('Invalid direct upload key');
600
+ }
601
+ return storedFilename;
602
+ }
603
+ /**
604
+ * Abre um upload multipart direto no storage. A chave segue o mesmo formato que o
605
+ * `uploadFromPath` grava (`file.location` = destination, `file.path` = uuid.ext do
606
+ * `getFilename` do provider), então o arquivo final é servido como qualquer outro.
607
+ *
608
+ * Nada vai para o banco aqui: o estado entre as chamadas fica com quem chamou (token
609
+ * assinado, ver `signDirectUploadToken`) e a linha `file` só nasce no complete.
610
+ * Tamanho da parte com a regra do Studio: no mínimo 16 MiB e no máximo 9000 partes.
611
+ */
612
+ async startDirectUpload(destination, info) {
613
+ var _a, _b;
614
+ if (!destination) {
615
+ throw new common_1.BadRequestException(`No destination provided`);
616
+ }
617
+ const size = Number(info === null || info === void 0 ? void 0 : info.size);
618
+ if (!Number.isInteger(size) || size <= 0) {
619
+ throw new common_1.BadRequestException(`No size provided`);
620
+ }
621
+ // Acima disso o tamanho não cabe exato num number, e a linha não teria como ser lida.
622
+ if (size > FILE_SIZE_COLUMN_MAX) {
623
+ throw new common_1.BadRequestException(`File too large: ${size} bytes`);
624
+ }
625
+ const mimetype = String((_a = info === null || info === void 0 ? void 0 : info.mimetype) !== null && _a !== void 0 ? _a : '').trim();
626
+ if (!(info === null || info === void 0 ? void 0 : info.skipMimeValidation) && !(await this.acceptMimetypes(mimetype))) {
627
+ throw new common_1.BadRequestException(`Invalid file type: ${mimetype}`);
628
+ }
629
+ if (!(info === null || info === void 0 ? void 0 : info.skipSizeValidation) && !(await this.maxFileSize(size))) {
630
+ throw new common_1.BadRequestException(`File too large: ${size} bytes`);
631
+ }
632
+ const originalname = this.normalizeUploadedFilename(String((_b = info === null || info === void 0 ? void 0 : info.originalname) !== null && _b !== void 0 ? _b : '').trim() || 'file');
633
+ const provider = await this.getDirectUploadProvider();
634
+ const key = `${destination}/${provider.getFilename(originalname)}`;
635
+ const uploadId = await provider.createMultipartUpload(key, mimetype || 'application/octet-stream');
636
+ const partSize = Math.max(exports.DIRECT_UPLOAD_MIN_PART_BYTES, Math.ceil(size / exports.DIRECT_UPLOAD_MAX_PARTS));
637
+ return {
638
+ key,
639
+ uploadId,
640
+ partSize,
641
+ partCount: Math.max(1, Math.ceil(size / partSize)),
642
+ };
643
+ }
644
+ /** URLs assinadas de PUT para as partes pedidas (1-based, sem repetir). */
645
+ async signDirectUploadParts(key, uploadId, partNumbers, ttlSeconds = exports.DIRECT_UPLOAD_DEFAULT_TTL_SECONDS) {
646
+ if (!key || !uploadId) {
647
+ throw new common_1.BadRequestException('Invalid direct upload');
648
+ }
649
+ const numbers = Array.isArray(partNumbers) ? partNumbers.map(Number) : [];
650
+ if (numbers.length === 0 ||
651
+ numbers.some((n) => !Number.isInteger(n) || n < 1 || n > exports.DIRECT_UPLOAD_MAX_PARTS)) {
652
+ throw new common_1.BadRequestException('Invalid part numbers');
653
+ }
654
+ const provider = await this.getDirectUploadProvider();
655
+ return provider.signUploadParts(key, uploadId, [...new Set(numbers)], Math.max(60, Math.floor(ttlSeconds)));
656
+ }
657
+ /** Aborta o multipart (as partes já enviadas somem do bucket). Upload já fechado não é erro. */
658
+ async abortDirectUpload(key, uploadId) {
659
+ var _a;
660
+ if (!key || !uploadId) {
661
+ throw new common_1.BadRequestException('Invalid direct upload');
662
+ }
663
+ const provider = await this.getDirectUploadProvider();
664
+ try {
665
+ await provider.abortMultipartUpload(key, uploadId);
666
+ }
667
+ catch (error) {
668
+ const status = (_a = error === null || error === void 0 ? void 0 : error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode;
669
+ if ((error === null || error === void 0 ? void 0 : error.name) === 'NoSuchUpload' || (error === null || error === void 0 ? void 0 : error.Code) === 'NoSuchUpload' || status === 404) {
670
+ return;
671
+ }
672
+ throw error;
673
+ }
674
+ }
675
+ /**
676
+ * Fecha o multipart e registra o arquivo. Confere o que o storage gravou antes de criar
677
+ * a linha — tamanho pelo HeadObject (tem que bater com o declarado no start), teto
678
+ * `storage-max-size`, allowlist `storage-accept-mimetype` e, quando pedido, os primeiros
679
+ * bytes (`verifyHead`) — e apaga o objeto quando algo não confere: um upload recusado
680
+ * não deixa blob órfão no bucket.
681
+ */
682
+ async completeDirectUpload(input) {
683
+ var _a, _b, _c, _d, _e;
684
+ const { key, uploadId, destination } = input !== null && input !== void 0 ? input : {};
685
+ if (!destination) {
686
+ throw new common_1.BadRequestException(`No destination provided`);
687
+ }
688
+ if (!uploadId) {
689
+ throw new common_1.BadRequestException('Invalid direct upload');
690
+ }
691
+ const storedFilename = this.assertDirectUploadKey(key, destination);
692
+ const parts = Array.isArray(input.parts) ? input.parts : [];
693
+ if (parts.length === 0 ||
694
+ parts.some((part) => !Number.isInteger(Number(part === null || part === void 0 ? void 0 : part.partNumber)) ||
695
+ Number(part.partNumber) < 1 ||
696
+ typeof (part === null || part === void 0 ? void 0 : part.etag) !== 'string' ||
697
+ !part.etag.trim())) {
698
+ throw new common_1.BadRequestException('Invalid upload parts');
699
+ }
700
+ const provider = await this.getDirectUploadProvider();
701
+ try {
702
+ await provider.completeMultipartUpload(key, uploadId, parts.map((part) => ({ partNumber: Number(part.partNumber), etag: part.etag.trim() })));
703
+ }
704
+ catch (error) {
705
+ const status = (_a = error === null || error === void 0 ? void 0 : error.$metadata) === null || _a === void 0 ? void 0 : _a.httpStatusCode;
706
+ if (typeof status === 'number' && status >= 400 && status < 500) {
707
+ // Parte faltando, ETag errado, parte pequena demais: o multipart não tem conserto.
708
+ await this.abortDirectUpload(key, uploadId).catch(() => undefined);
709
+ throw new common_1.BadRequestException('The uploaded parts could not be assembled');
710
+ }
711
+ throw error;
712
+ }
713
+ const discard = async () => {
714
+ await provider.delete(key).catch((error) => this.logger.warn(`Failed to delete rejected direct upload ${key}: ${error === null || error === void 0 ? void 0 : error.message}`));
715
+ };
716
+ const declaredSize = Number(input.size);
717
+ const storedSize = this.getFileSizeFromMetadata(await provider.metaData(key));
718
+ if (storedSize === undefined || storedSize !== declaredSize) {
719
+ await discard();
720
+ throw new common_1.BadRequestException(`Stored size (${storedSize !== null && storedSize !== void 0 ? storedSize : 'unknown'} bytes) differs from the declared size (${declaredSize} bytes)`);
721
+ }
722
+ if (storedSize > FILE_SIZE_COLUMN_MAX ||
723
+ (!input.skipSizeValidation && !(await this.maxFileSize(storedSize)))) {
724
+ await discard();
725
+ throw new common_1.BadRequestException(`File too large: ${storedSize} bytes`);
726
+ }
727
+ let mimetype = String((_b = input.mimetype) !== null && _b !== void 0 ? _b : '').trim();
728
+ if (input.verifyHead) {
729
+ try {
730
+ const verified = await input.verifyHead.check(await provider.readHead(key, input.verifyHead.bytes));
731
+ if (typeof verified === 'string' && verified.trim()) {
732
+ mimetype = verified.trim();
733
+ }
734
+ }
735
+ catch (error) {
736
+ await discard();
737
+ throw error;
738
+ }
739
+ }
740
+ if (!input.skipMimeValidation && !(await this.acceptMimetypes(mimetype))) {
741
+ await discard();
742
+ throw new common_1.BadRequestException(`Invalid file type: ${mimetype}`);
743
+ }
744
+ try {
745
+ return await this.prismaService.file.create({
746
+ data: {
747
+ filename: this.normalizeUploadedFilename(String((_c = input.originalname) !== null && _c !== void 0 ? _c : '').trim() || storedFilename),
748
+ path: storedFilename,
749
+ provider_id: this.providerId,
750
+ location: destination,
751
+ mimetype_id: await this.getMimeType(mimetype),
752
+ size: storedSize,
753
+ is_private: (_d = input.isPrivate) !== null && _d !== void 0 ? _d : false,
754
+ created_by_user_id: (_e = input.createdByUserId) !== null && _e !== void 0 ? _e : null,
755
+ },
756
+ });
757
+ }
758
+ catch (error) {
759
+ await discard();
760
+ throw error;
761
+ }
762
+ }
763
+ /**
764
+ * Token opaco que carrega o estado de um upload direto entre as chamadas (sem tabela):
765
+ * JWT HS256 com o JWT_SECRET da API e o tipo `file-direct-upload`, como o token do
766
+ * `file-upload-ticket`. Quem chama põe nas claims o que precisa amarrar (marca, usuário).
767
+ */
768
+ signDirectUploadToken(claims, ttlSeconds = exports.DIRECT_UPLOAD_DEFAULT_TTL_SECONDS) {
769
+ return this.jwtService.sign(Object.assign(Object.assign({}, claims), { t: DIRECT_UPLOAD_TOKEN_TYPE }), {
770
+ secret: process.env.JWT_SECRET,
771
+ expiresIn: `${Math.max(1, Math.floor(ttlSeconds))}s`,
772
+ });
773
+ }
774
+ /** Claims do token de upload direto; assinatura inválida, expirado ou de outro tipo = 400. */
775
+ readDirectUploadToken(token) {
776
+ let payload;
777
+ try {
778
+ payload = this.jwtService.verify(String(token !== null && token !== void 0 ? token : ''), { secret: process.env.JWT_SECRET });
779
+ }
780
+ catch (_a) {
781
+ throw new common_1.BadRequestException('Invalid or expired upload token');
782
+ }
783
+ if ((payload === null || payload === void 0 ? void 0 : payload.t) !== DIRECT_UPLOAD_TOKEN_TYPE) {
784
+ throw new common_1.BadRequestException('Token is not a direct upload token');
785
+ }
786
+ return payload;
787
+ }
561
788
  /**
562
789
  * Lista as imagens armazenadas que valem uma passada por `reoptimizeFile`, para a
563
790
  * operação em massa de reprocessamento do acervo.
@@ -619,7 +846,7 @@ let FileService = FileService_1 = class FileService {
619
846
  var _a;
620
847
  const { file, buffer } = await this.getBuffer(fileId);
621
848
  const currentMimetype = file.file_mimetype.name;
622
- const oldSize = (_a = file.size) !== null && _a !== void 0 ? _a : buffer.length;
849
+ const oldSize = Number((_a = file.size) !== null && _a !== void 0 ? _a : buffer.length);
623
850
  if (!currentMimetype.startsWith('image/')) {
624
851
  return { changed: false, oldSize, newSize: oldSize, mimetypeChanged: false };
625
852
  }
@@ -1482,6 +1709,21 @@ let FileService = FileService_1 = class FileService {
1482
1709
  expiresIn: (_a = params.expiresInSeconds) !== null && _a !== void 0 ? _a : 900,
1483
1710
  });
1484
1711
  }
1712
+ /**
1713
+ * Apaga um objeto de bucket avulso, com as credenciais de quem o configurou.
1714
+ *
1715
+ * Mesmo motivo do `headS3Object` e do `signS3Object`: o bucket e de outra
1716
+ * library (o Studio guarda os brutos no perfil de armazenamento dele), e nao o
1717
+ * destino ativo do core. O S3 responde 204 tambem para key inexistente, entao
1718
+ * apagar duas vezes nao e erro.
1719
+ */
1720
+ async deleteS3Object(params) {
1721
+ const s3 = new client_s3_1.S3Client({
1722
+ region: params.region,
1723
+ credentials: Object.assign({ accessKeyId: params.accessKeyId, secretAccessKey: params.secretAccessKey }, (params.sessionToken ? { sessionToken: params.sessionToken } : {})),
1724
+ });
1725
+ await s3.send(new client_s3_1.DeleteObjectCommand({ Bucket: params.bucket, Key: params.key }));
1726
+ }
1485
1727
  async headS3Bucket(params) {
1486
1728
  const s3 = new client_s3_1.S3Client({
1487
1729
  region: params.region,