@onroad/core 4.0.0-alpha.4 → 4.0.0-alpha.40

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 (83) hide show
  1. package/README.md +604 -54
  2. package/dist/OnRoadExpress.d.ts.map +1 -1
  3. package/dist/OnRoadExpress.js +18 -5
  4. package/dist/OnRoadExpress.js.map +1 -1
  5. package/dist/core/AbstractController.d.ts +10 -0
  6. package/dist/core/AbstractController.d.ts.map +1 -1
  7. package/dist/core/AbstractController.js +48 -1
  8. package/dist/core/AbstractController.js.map +1 -1
  9. package/dist/core/AbstractService.d.ts +5 -0
  10. package/dist/core/AbstractService.d.ts.map +1 -1
  11. package/dist/core/AbstractService.js +36 -0
  12. package/dist/core/AbstractService.js.map +1 -1
  13. package/dist/core/SequelizeRepository.d.ts +5 -1
  14. package/dist/core/SequelizeRepository.d.ts.map +1 -1
  15. package/dist/core/SequelizeRepository.js +26 -1
  16. package/dist/core/SequelizeRepository.js.map +1 -1
  17. package/dist/database/ConnectionManager.d.ts +1 -0
  18. package/dist/database/ConnectionManager.d.ts.map +1 -1
  19. package/dist/database/ConnectionManager.js +10 -1
  20. package/dist/database/ConnectionManager.js.map +1 -1
  21. package/dist/dev/DevServer.d.ts +67 -0
  22. package/dist/dev/DevServer.d.ts.map +1 -0
  23. package/dist/dev/DevServer.js +496 -0
  24. package/dist/dev/DevServer.js.map +1 -0
  25. package/dist/dev/DevToolsController.d.ts +45 -0
  26. package/dist/dev/DevToolsController.d.ts.map +1 -0
  27. package/dist/dev/DevToolsController.js +426 -0
  28. package/dist/dev/DevToolsController.js.map +1 -0
  29. package/dist/dev/DevToolsPlugin.d.ts +10 -0
  30. package/dist/dev/DevToolsPlugin.d.ts.map +1 -0
  31. package/dist/dev/DevToolsPlugin.js +23 -0
  32. package/dist/dev/DevToolsPlugin.js.map +1 -0
  33. package/dist/dev/MigrationCLI.d.ts +19 -0
  34. package/dist/dev/MigrationCLI.d.ts.map +1 -0
  35. package/dist/dev/MigrationCLI.js +140 -0
  36. package/dist/dev/MigrationCLI.js.map +1 -0
  37. package/dist/dev/index.d.ts +8 -0
  38. package/dist/dev/index.d.ts.map +1 -0
  39. package/dist/dev/index.js +5 -0
  40. package/dist/dev/index.js.map +1 -0
  41. package/dist/entity/EntityRegistry.d.ts +26 -0
  42. package/dist/entity/EntityRegistry.d.ts.map +1 -1
  43. package/dist/entity/EntityRegistry.js +140 -4
  44. package/dist/entity/EntityRegistry.js.map +1 -1
  45. package/dist/entity/decorators.d.ts +1 -0
  46. package/dist/entity/decorators.d.ts.map +1 -1
  47. package/dist/entity/decorators.js.map +1 -1
  48. package/dist/filters/builtins/JwtFilter.d.ts +6 -3
  49. package/dist/filters/builtins/JwtFilter.d.ts.map +1 -1
  50. package/dist/filters/builtins/JwtFilter.js +29 -4
  51. package/dist/filters/builtins/JwtFilter.js.map +1 -1
  52. package/dist/index.d.ts +3 -1
  53. package/dist/index.d.ts.map +1 -1
  54. package/dist/index.js +3 -1
  55. package/dist/index.js.map +1 -1
  56. package/dist/storage/AnexoController.d.ts +11 -0
  57. package/dist/storage/AnexoController.d.ts.map +1 -0
  58. package/dist/storage/AnexoController.js +79 -0
  59. package/dist/storage/AnexoController.js.map +1 -0
  60. package/dist/storage/AnexoEntity.d.ts +12 -0
  61. package/dist/storage/AnexoEntity.d.ts.map +1 -0
  62. package/dist/storage/AnexoEntity.js +62 -0
  63. package/dist/storage/AnexoEntity.js.map +1 -0
  64. package/dist/storage/AnexoRepository.d.ts +5 -0
  65. package/dist/storage/AnexoRepository.d.ts.map +1 -0
  66. package/dist/storage/AnexoRepository.js +16 -0
  67. package/dist/storage/AnexoRepository.js.map +1 -0
  68. package/dist/storage/AnexoService.d.ts +56 -0
  69. package/dist/storage/AnexoService.d.ts.map +1 -0
  70. package/dist/storage/AnexoService.js +182 -0
  71. package/dist/storage/AnexoService.js.map +1 -0
  72. package/dist/storage/GCSStorageProvider.d.ts +15 -0
  73. package/dist/storage/GCSStorageProvider.d.ts.map +1 -0
  74. package/dist/storage/GCSStorageProvider.js +58 -0
  75. package/dist/storage/GCSStorageProvider.js.map +1 -0
  76. package/dist/storage/StorageProvider.d.ts +28 -0
  77. package/dist/storage/StorageProvider.d.ts.map +1 -1
  78. package/dist/storage/StorageProvider.js.map +1 -1
  79. package/dist/storage/index.d.ts +5 -1
  80. package/dist/storage/index.d.ts.map +1 -1
  81. package/dist/storage/index.js +4 -0
  82. package/dist/storage/index.js.map +1 -1
  83. package/package.json +11 -1
@@ -0,0 +1,11 @@
1
+ import { AbstractController } from "../core/AbstractController.js";
2
+ import { AnexoService } from "./AnexoService.js";
3
+ export declare class AnexoController extends AbstractController<AnexoService> {
4
+ constructor();
5
+ intent(req: unknown, res: unknown): Promise<void>;
6
+ confirm(req: unknown, res: unknown): Promise<void>;
7
+ readByData(req: unknown, res: unknown): Promise<void>;
8
+ signedUrl(req: unknown, res: unknown): Promise<void>;
9
+ delete(req: unknown, res: unknown): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=AnexoController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoController.d.ts","sourceRoot":"","sources":["../../src/storage/AnexoController.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAEhD,qBACa,eAAgB,SAAQ,kBAAkB,CAAC,YAAY,CAAC;;IAmC7D,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,OAAO,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAWlD,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAMrD,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAKjE"}
@@ -0,0 +1,79 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Controller } from "../container/index.js";
11
+ import { AbstractController } from "../core/AbstractController.js";
12
+ import { AnexoService } from "./AnexoService.js";
13
+ let AnexoController = class AnexoController extends AbstractController {
14
+ constructor() {
15
+ super({
16
+ service: AnexoService,
17
+ prefix: "anexo",
18
+ routes: {
19
+ intent: {
20
+ method: "post",
21
+ path: "/anexo/intent",
22
+ hasMessagingEvent: false,
23
+ },
24
+ confirm: {
25
+ method: "post",
26
+ path: "/anexo/confirm",
27
+ hasMessagingEvent: true,
28
+ },
29
+ readByData: {
30
+ method: "post",
31
+ path: "/anexo/readByData",
32
+ hasMessagingEvent: false,
33
+ },
34
+ signedUrl: {
35
+ method: "post",
36
+ path: "/anexo/signedUrl",
37
+ hasMessagingEvent: false,
38
+ },
39
+ delete: {
40
+ method: "delete",
41
+ path: "/anexo/:id",
42
+ hasMessagingEvent: true,
43
+ },
44
+ },
45
+ });
46
+ }
47
+ async intent(req, res) {
48
+ const { body } = req;
49
+ const json = res.json.bind(res);
50
+ json(await this.service.createUploadIntent(body));
51
+ }
52
+ async confirm(req, res) {
53
+ const { body, sentinel } = req;
54
+ const json = res.json.bind(res);
55
+ json(await this.service.confirmUpload(body, sentinel));
56
+ }
57
+ async readByData(req, res) {
58
+ const { body } = req;
59
+ const json = res.json.bind(res);
60
+ json(await this.service.readByDataId(body.dataId, body.dataContext));
61
+ }
62
+ async signedUrl(req, res) {
63
+ const { body } = req;
64
+ const json = res.json.bind(res);
65
+ const url = await this.service.getSignedUrl(body.key);
66
+ json({ signedUrl: url });
67
+ }
68
+ async delete(req, res) {
69
+ const { params, query } = req;
70
+ const json = res.json.bind(res);
71
+ json(await this.service.delete(Number(params.id), query?.key));
72
+ }
73
+ };
74
+ AnexoController = __decorate([
75
+ Controller("/"),
76
+ __metadata("design:paramtypes", [])
77
+ ], AnexoController);
78
+ export { AnexoController };
79
+ //# sourceMappingURL=AnexoController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoController.js","sourceRoot":"","sources":["../../src/storage/AnexoController.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGzC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,kBAAgC;IACnE;QACE,KAAK,CAAC;YACJ,OAAO,EAAE,YAAY;YACrB,MAAM,EAAE,OAAO;YACf,MAAM,EAAE;gBACN,MAAM,EAAE;oBACN,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,eAAe;oBACrB,iBAAiB,EAAE,KAAK;iBACzB;gBACD,OAAO,EAAE;oBACP,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,gBAAgB;oBACtB,iBAAiB,EAAE,IAAI;iBACxB;gBACD,UAAU,EAAE;oBACV,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,mBAAmB;oBACzB,iBAAiB,EAAE,KAAK;iBACzB;gBACD,SAAS,EAAE;oBACT,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,kBAAkB;oBACxB,iBAAiB,EAAE,KAAK;iBACzB;gBACD,MAAM,EAAE;oBACN,MAAM,EAAE,QAAQ;oBAChB,IAAI,EAAE,YAAY;oBAClB,iBAAiB,EAAE,IAAI;iBACxB;aACF;SACF,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,GAAY;QACrC,MAAM,EAAE,IAAI,EAAE,GAAG,GAAwC,CAAA;QACzD,MAAM,IAAI,GAAI,GAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAyD,CAAC,CAAC,CAAA;IACxG,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAY,EAAE,GAAY;QACtC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,GAA4D,CAAA;QACvF,MAAM,IAAI,GAAI,GAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,CACF,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAC9B,IAAoD,EACpD,QAAwD,CACzD,CACF,CAAA;IACH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,GAAY,EAAE,GAAY;QACzC,MAAM,EAAE,IAAI,EAAE,GAAG,GAAwD,CAAA;QACzE,MAAM,IAAI,GAAI,GAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;IACtE,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,GAAY,EAAE,GAAY;QACxC,MAAM,EAAE,IAAI,EAAE,GAAG,GAAgC,CAAA;QACjD,MAAM,IAAI,GAAI,GAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACrD,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;IAC1B,CAAC;IAEQ,KAAK,CAAC,MAAM,CAAC,GAAY,EAAE,GAAY;QAC9C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAA2D,CAAA;QACrF,MAAM,IAAI,GAAI,GAAkC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/D,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAA;IAChE,CAAC;CACF,CAAA;AAtEY,eAAe;IAD3B,UAAU,CAAC,GAAG,CAAC;;GACH,eAAe,CAsE3B"}
@@ -0,0 +1,12 @@
1
+ export declare class Anexo {
2
+ key: string;
3
+ author: string;
4
+ dataContext: string;
5
+ fileType: string;
6
+ dataId: string;
7
+ originalName: string;
8
+ contentType: string;
9
+ size: number;
10
+ bucket: string;
11
+ }
12
+ //# sourceMappingURL=AnexoEntity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoEntity.d.ts","sourceRoot":"","sources":["../../src/storage/AnexoEntity.ts"],"names":[],"mappings":"AAEA,qBACa,KAAK;IAEhB,GAAG,EAAG,MAAM,CAAA;IAGZ,MAAM,EAAG,MAAM,CAAA;IAGf,WAAW,EAAG,MAAM,CAAA;IAGpB,QAAQ,EAAG,MAAM,CAAA;IAGjB,MAAM,EAAG,MAAM,CAAA;IAGf,YAAY,EAAG,MAAM,CAAA;IAGrB,WAAW,EAAG,MAAM,CAAA;IAGpB,IAAI,EAAG,MAAM,CAAA;IAGb,MAAM,EAAG,MAAM,CAAA;CAChB"}
@@ -0,0 +1,62 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Column, DataType } from "../entity/index.js";
11
+ let Anexo = class Anexo {
12
+ key;
13
+ author;
14
+ dataContext;
15
+ fileType;
16
+ dataId;
17
+ originalName;
18
+ contentType;
19
+ size;
20
+ bucket;
21
+ };
22
+ __decorate([
23
+ Column({ type: DataType.STRING, allowNull: false }),
24
+ __metadata("design:type", String)
25
+ ], Anexo.prototype, "key", void 0);
26
+ __decorate([
27
+ Column({ type: DataType.STRING }),
28
+ __metadata("design:type", String)
29
+ ], Anexo.prototype, "author", void 0);
30
+ __decorate([
31
+ Column({ type: DataType.STRING }),
32
+ __metadata("design:type", String)
33
+ ], Anexo.prototype, "dataContext", void 0);
34
+ __decorate([
35
+ Column({ type: DataType.STRING }),
36
+ __metadata("design:type", String)
37
+ ], Anexo.prototype, "fileType", void 0);
38
+ __decorate([
39
+ Column({ type: DataType.STRING }),
40
+ __metadata("design:type", String)
41
+ ], Anexo.prototype, "dataId", void 0);
42
+ __decorate([
43
+ Column({ type: DataType.STRING }),
44
+ __metadata("design:type", String)
45
+ ], Anexo.prototype, "originalName", void 0);
46
+ __decorate([
47
+ Column({ type: DataType.STRING }),
48
+ __metadata("design:type", String)
49
+ ], Anexo.prototype, "contentType", void 0);
50
+ __decorate([
51
+ Column({ type: DataType.INTEGER }),
52
+ __metadata("design:type", Number)
53
+ ], Anexo.prototype, "size", void 0);
54
+ __decorate([
55
+ Column({ type: DataType.STRING }),
56
+ __metadata("design:type", String)
57
+ ], Anexo.prototype, "bucket", void 0);
58
+ Anexo = __decorate([
59
+ Entity("anexo", { engine: "sequelize", timestamps: true })
60
+ ], Anexo);
61
+ export { Anexo };
62
+ //# sourceMappingURL=AnexoEntity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoEntity.js","sourceRoot":"","sources":["../../src/storage/AnexoEntity.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGtD,IAAM,KAAK,GAAX,MAAM,KAAK;IAEhB,GAAG,CAAS;IAGZ,MAAM,CAAS;IAGf,WAAW,CAAS;IAGpB,QAAQ,CAAS;IAGjB,MAAM,CAAS;IAGf,YAAY,CAAS;IAGrB,WAAW,CAAS;IAGpB,IAAI,CAAS;IAGb,MAAM,CAAS;CAChB,CAAA;AAzBC;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;;kCACxC;AAGZ;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;qCACnB;AAGf;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;0CACd;AAGpB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;uCACjB;AAGjB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;qCACnB;AAGf;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;2CACb;AAGrB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;0CACd;AAGpB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;;mCACtB;AAGb;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;;qCACnB;AA1BJ,KAAK;IADjB,MAAM,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;GAC9C,KAAK,CA2BjB"}
@@ -0,0 +1,5 @@
1
+ import { SequelizeRepository } from "../core/SequelizeRepository.js";
2
+ import { Anexo } from "./AnexoEntity.js";
3
+ export declare class AnexoRepository extends SequelizeRepository<Anexo> {
4
+ }
5
+ //# sourceMappingURL=AnexoRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoRepository.d.ts","sourceRoot":"","sources":["../../src/storage/AnexoRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,qBACa,eAAgB,SAAQ,mBAAmB,CAAC,KAAK,CAAC;CAAG"}
@@ -0,0 +1,16 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Repository } from "../container/index.js";
8
+ import { SequelizeRepository } from "../core/SequelizeRepository.js";
9
+ import { Anexo } from "./AnexoEntity.js";
10
+ let AnexoRepository = class AnexoRepository extends SequelizeRepository {
11
+ };
12
+ AnexoRepository = __decorate([
13
+ Repository({ entity: Anexo })
14
+ ], AnexoRepository);
15
+ export { AnexoRepository };
16
+ //# sourceMappingURL=AnexoRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoRepository.js","sourceRoot":"","sources":["../../src/storage/AnexoRepository.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAA;AACpE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAGjC,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,mBAA0B;CAAG,CAAA;AAArD,eAAe;IAD3B,UAAU,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;GACjB,eAAe,CAAsC"}
@@ -0,0 +1,56 @@
1
+ import { AbstractService } from "../core/AbstractService.js";
2
+ import { Sentinel } from "../core/Sentinel.js";
3
+ import { StorageProvider } from "./StorageProvider.js";
4
+ import { AnexoRepository } from "./AnexoRepository.js";
5
+ export declare class AnexoService extends AbstractService<AnexoRepository> {
6
+ protected storage: StorageProvider;
7
+ constructor();
8
+ /** Lazily initialise the StorageProvider. Override to use a custom provider. */
9
+ protected getStorage(): Promise<StorageProvider>;
10
+ /** Allow external configuration of the storage provider. */
11
+ setStorageProvider(provider: StorageProvider): void;
12
+ createUploadIntent(payload: {
13
+ fileName: string;
14
+ contentType: string;
15
+ dataId: number;
16
+ dataContext: string;
17
+ }): Promise<{
18
+ uploadUrl: string;
19
+ key: string;
20
+ dataId: number;
21
+ dataContext: string;
22
+ fileName: string;
23
+ contentType: string;
24
+ }>;
25
+ confirmUpload(payload: {
26
+ key: string;
27
+ dataId: number;
28
+ dataContext: string;
29
+ fileName: string;
30
+ contentType: string;
31
+ }, sentinel?: Sentinel): Promise<{
32
+ id: number;
33
+ dataValues?: Record<string, unknown>;
34
+ }>;
35
+ create(form: Record<string, unknown>, sentinel?: Sentinel): Promise<{
36
+ id: number;
37
+ dataValues?: Record<string, unknown>;
38
+ }>;
39
+ /**
40
+ * Read anexos by dataId + dataContext, enriching each with a signed read URL.
41
+ * Overrides AbstractService.read so downstream callers work transparently.
42
+ */
43
+ read(dataId: unknown, ...args: unknown[]): Promise<unknown>;
44
+ readByDataId(dataId: number, dataContext: string): Promise<Record<string, unknown>[]>;
45
+ readAnexosInBatch(dataIds: number[], dataContext: string): Promise<Map<string, unknown[]>>;
46
+ delete(id: number, key?: string): Promise<unknown>;
47
+ /** @deprecated Use the upload intent flow instead. */
48
+ createByData(anexos: Array<{
49
+ buffer: Buffer;
50
+ originalname: string;
51
+ mimetype: string;
52
+ }>, dataId: number, dataContext: string, sentinel?: Sentinel): Promise<void>;
53
+ findByKey(key: string): Promise<unknown>;
54
+ getSignedUrl(key: string): Promise<string>;
55
+ }
56
+ //# sourceMappingURL=AnexoService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoService.d.ts","sourceRoot":"","sources":["../../src/storage/AnexoService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAG9C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAItD,qBACa,YAAa,SAAQ,eAAe,CAAC,eAAe,CAAC;IAChE,SAAS,CAAC,OAAO,EAAG,eAAe,CAAA;;IAMnC,gFAAgF;cAChE,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAQtD,4DAA4D;IAC5D,kBAAkB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAI7C,kBAAkB,CAAC,OAAO,EAAE;QAChC,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;QACnB,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;KACpB;;;;;;;;IAsBK,aAAa,CACjB,OAAO,EAAE;QACP,GAAG,EAAE,MAAM,CAAA;QACX,MAAM,EAAE,MAAM,CAAA;QACd,WAAW,EAAE,MAAM,CAAA;QACnB,QAAQ,EAAE,MAAM,CAAA;QAChB,WAAW,EAAE,MAAM,CAAA;KACpB,EACD,QAAQ,CAAC,EAAE,QAAQ;YAaK,MAAM;qBAAe,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;IASvD,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ;YAEhE,MAAM;qBACG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;IAQxC;;;OAGG;IACY,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE;IAQjD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IA6BhD,iBAAiB,CACrB,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IA6BnB,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM;IAc9C,sDAAsD;IAChD,YAAY,CAChB,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,EACzE,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,QAAQ;IAyBf,SAAS,CAAC,GAAG,EAAE,MAAM;IAIrB,YAAY,CAAC,GAAG,EAAE,MAAM;CAI/B"}
@@ -0,0 +1,182 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Service } from "../container/index.js";
11
+ import { AbstractService } from "../core/AbstractService.js";
12
+ import { MatchingObject } from "../messaging/index.js";
13
+ import { getRequestContext } from "../context/RequestContext.js";
14
+ import { AnexoRepository } from "./AnexoRepository.js";
15
+ const ANEXO_CONTEXT = "anexos";
16
+ let AnexoService = class AnexoService extends AbstractService {
17
+ storage;
18
+ constructor() {
19
+ super({ repository: AnexoRepository });
20
+ }
21
+ /** Lazily initialise the StorageProvider. Override to use a custom provider. */
22
+ async getStorage() {
23
+ if (!this.storage) {
24
+ const { GCSStorageProvider } = await import("./GCSStorageProvider.js");
25
+ this.storage = new GCSStorageProvider(process.env.GCS_BUCKET || "teraprox-storage");
26
+ }
27
+ return this.storage;
28
+ }
29
+ /** Allow external configuration of the storage provider. */
30
+ setStorageProvider(provider) {
31
+ this.storage = provider;
32
+ }
33
+ async createUploadIntent(payload) {
34
+ const { tenant } = getRequestContext();
35
+ const { fileName, contentType, dataId, dataContext } = payload;
36
+ const storage = await this.getStorage();
37
+ const key = storage.buildObjectKey({
38
+ tenant,
39
+ dataContext,
40
+ originalName: fileName,
41
+ contentType,
42
+ author: "system",
43
+ });
44
+ const url = await storage.generateSignedUrl(key, {
45
+ action: "write",
46
+ contentType,
47
+ expiresMs: 3600_000,
48
+ });
49
+ return { uploadUrl: url, key, dataId, dataContext, fileName, contentType };
50
+ }
51
+ async confirmUpload(payload, sentinel) {
52
+ const storage = await this.getStorage();
53
+ const metadata = await storage.getObjectMetadata(payload.key);
54
+ const anexo = (await this.repository.create({
55
+ key: payload.key,
56
+ dataId: payload.dataId,
57
+ dataContext: payload.dataContext,
58
+ originalName: payload.fileName,
59
+ contentType: payload.contentType,
60
+ size: metadata?.size ?? 0,
61
+ author: "system",
62
+ }));
63
+ sentinel?.appendMo(new MatchingObject(ANEXO_CONTEXT, "registroDeTarefaForm", { content: anexo }));
64
+ return anexo;
65
+ }
66
+ async create(form, sentinel) {
67
+ const anexo = (await this.repository.create(form));
68
+ sentinel?.appendMo(new MatchingObject(ANEXO_CONTEXT, "registroDeTarefaForm", { content: anexo }));
69
+ return anexo;
70
+ }
71
+ /**
72
+ * Read anexos by dataId + dataContext, enriching each with a signed read URL.
73
+ * Overrides AbstractService.read so downstream callers work transparently.
74
+ */
75
+ async read(dataId, ...args) {
76
+ const dataContext = args[0];
77
+ if (dataContext) {
78
+ return this.readByDataId(dataId, dataContext);
79
+ }
80
+ return super.read(dataId);
81
+ }
82
+ async readByDataId(dataId, dataContext) {
83
+ try {
84
+ const anexos = (await this.repository.findAll({
85
+ where: { dataId: String(dataId), dataContext },
86
+ }));
87
+ return await Promise.all(anexos.map(async (anexo) => {
88
+ const data = (anexo.dataValues ?? anexo);
89
+ try {
90
+ const s = await this.getStorage();
91
+ data.signedUrl = await s.generateSignedUrl(data.key, {
92
+ action: "read",
93
+ });
94
+ }
95
+ catch {
96
+ data.signedUrl = null;
97
+ }
98
+ return data;
99
+ }));
100
+ }
101
+ catch {
102
+ return [];
103
+ }
104
+ }
105
+ async readAnexosInBatch(dataIds, dataContext) {
106
+ const anexosMap = new Map();
107
+ try {
108
+ const stringIds = dataIds.map(String);
109
+ const anexos = (await this.repository.findAll({
110
+ where: { dataId: stringIds, dataContext },
111
+ }));
112
+ for (const anexo of anexos) {
113
+ const data = (anexo.dataValues ?? anexo);
114
+ const dId = String(data.dataId);
115
+ try {
116
+ const s = await this.getStorage();
117
+ data.signedUrl = await s.generateSignedUrl(data.key, {
118
+ action: "read",
119
+ });
120
+ }
121
+ catch {
122
+ data.signedUrl = null;
123
+ }
124
+ const current = anexosMap.get(dId);
125
+ if (current)
126
+ current.push(data);
127
+ else
128
+ anexosMap.set(dId, [data]);
129
+ }
130
+ }
131
+ catch {
132
+ // anexo table unavailable
133
+ }
134
+ return anexosMap;
135
+ }
136
+ async delete(id, key) {
137
+ let anexoId = id;
138
+ if (!id && key) {
139
+ const anexo = (await this.findByKey(key));
140
+ if (!anexo)
141
+ return false;
142
+ anexoId = anexo.id;
143
+ }
144
+ if (key) {
145
+ const storage = await this.getStorage();
146
+ await storage.deleteObject(key);
147
+ }
148
+ return await this.repository.destroy(anexoId);
149
+ }
150
+ /** @deprecated Use the upload intent flow instead. */
151
+ async createByData(anexos, dataId, dataContext, sentinel) {
152
+ const { tenant } = getRequestContext();
153
+ const author = sentinel?.req?.decoded?.userName ??
154
+ "unknown";
155
+ for (const anx of anexos) {
156
+ const { buffer, originalname, mimetype } = anx;
157
+ const storage = await this.getStorage();
158
+ const key = storage.buildObjectKey({
159
+ tenant,
160
+ dataContext,
161
+ originalName: originalname,
162
+ contentType: mimetype,
163
+ author,
164
+ });
165
+ await storage.upload("", key, buffer, mimetype);
166
+ await this.create({ key, originalName: originalname, mimetype, dataContext, dataId, author }, sentinel);
167
+ }
168
+ }
169
+ async findByKey(key) {
170
+ return await this.repository.findOne({ where: { key } });
171
+ }
172
+ async getSignedUrl(key) {
173
+ const storage = await this.getStorage();
174
+ return await storage.generateSignedUrl(key, { action: "read" });
175
+ }
176
+ };
177
+ AnexoService = __decorate([
178
+ Service(),
179
+ __metadata("design:paramtypes", [])
180
+ ], AnexoService);
181
+ export { AnexoService };
182
+ //# sourceMappingURL=AnexoService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnexoService.js","sourceRoot":"","sources":["../../src/storage/AnexoService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { StorageProvider, UploadOptions, SignedUrlOptions, ObjectMetadata } from "./StorageProvider.js";
2
+ export declare class GCSStorageProvider extends StorageProvider {
3
+ private storage;
4
+ private bucketName;
5
+ constructor(bucketName: string);
6
+ buildObjectKey(opts: UploadOptions): string;
7
+ generateSignedUrl(key: string, opts: SignedUrlOptions): Promise<string>;
8
+ getObjectMetadata(key: string): Promise<ObjectMetadata | null>;
9
+ deleteObject(key: string): Promise<void>;
10
+ upload(_bucketName: string, _filePath: string, _data: Buffer, _contentType?: string): Promise<string>;
11
+ download(_bucketName: string, _filePath: string): Promise<Buffer>;
12
+ delete(_bucketName: string, filePath: string): Promise<void>;
13
+ getSignedUrl(_bucketName: string, filePath: string, expiresMs: number): Promise<string>;
14
+ }
15
+ //# sourceMappingURL=GCSStorageProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GCSStorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/GCSStorageProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEvG,qBAAa,kBAAmB,SAAQ,eAAe;IACrD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAQ;gBAEd,UAAU,EAAE,MAAM;IAM9B,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAMrC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAcvE,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAY9D,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKxC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAGrG,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAGjE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAG5D,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAG9F"}
@@ -0,0 +1,58 @@
1
+ import { Storage } from "@google-cloud/storage";
2
+ import { randomUUID } from "node:crypto";
3
+ import { StorageProvider } from "./StorageProvider.js";
4
+ export class GCSStorageProvider extends StorageProvider {
5
+ storage;
6
+ bucketName;
7
+ constructor(bucketName) {
8
+ super();
9
+ this.storage = new Storage(); // ADC - Assumes Cloud Run SA context
10
+ this.bucketName = bucketName;
11
+ }
12
+ buildObjectKey(opts) {
13
+ const uuid = randomUUID();
14
+ const safeName = opts.originalName.replace(/[^a-zA-Z0-9._-]/g, "_");
15
+ return `${opts.tenant}/${opts.dataContext}/${uuid}/${safeName}`;
16
+ }
17
+ async generateSignedUrl(key, opts) {
18
+ const file = this.storage.bucket(this.bucketName).file(key);
19
+ const defaultExpiry = opts.action === "write" ? 15 * 60_000 : 60 * 60_000;
20
+ const expires = opts.expiresMs ?? defaultExpiry;
21
+ const [url] = await file.getSignedUrl({
22
+ version: "v4",
23
+ action: opts.action,
24
+ expires: Date.now() + expires,
25
+ ...(opts.contentType && { contentType: opts.contentType }),
26
+ });
27
+ return url;
28
+ }
29
+ async getObjectMetadata(key) {
30
+ try {
31
+ const [metadata] = await this.storage.bucket(this.bucketName).file(key).getMetadata();
32
+ return {
33
+ size: Number(metadata.size),
34
+ contentType: metadata.contentType ?? ""
35
+ };
36
+ }
37
+ catch {
38
+ return null;
39
+ }
40
+ }
41
+ async deleteObject(key) {
42
+ await this.storage.bucket(this.bucketName).file(key).delete({ ignoreNotFound: true });
43
+ }
44
+ // Deprecated stubs to satisfy abstract class until full migration
45
+ async upload(_bucketName, _filePath, _data, _contentType) {
46
+ throw new Error("GCSStorageProvider.upload is deprecated. Use client-side direct upload via generateSignedUrl.");
47
+ }
48
+ async download(_bucketName, _filePath) {
49
+ throw new Error("GCSStorageProvider.download is deprecated. Use client-side fetch via generateSignedUrl.");
50
+ }
51
+ async delete(_bucketName, filePath) {
52
+ return this.deleteObject(filePath);
53
+ }
54
+ async getSignedUrl(_bucketName, filePath, expiresMs) {
55
+ return this.generateSignedUrl(filePath, { action: "read", expiresMs });
56
+ }
57
+ }
58
+ //# sourceMappingURL=GCSStorageProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GCSStorageProvider.js","sourceRoot":"","sources":["../../src/storage/GCSStorageProvider.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,35 @@
1
+ export interface UploadOptions {
2
+ tenant: string;
3
+ dataContext: string;
4
+ originalName: string;
5
+ contentType: string;
6
+ author: string;
7
+ }
8
+ export interface SignedUrlOptions {
9
+ action: "read" | "write";
10
+ contentType?: string;
11
+ expiresMs?: number;
12
+ }
13
+ export interface ObjectMetadata {
14
+ size: number;
15
+ contentType: string;
16
+ }
1
17
  export declare abstract class StorageProvider {
18
+ /** Generates a signed URL for reading or writing. */
19
+ abstract generateSignedUrl(key: string, opts: SignedUrlOptions): Promise<string>;
20
+ /** Retrieves object metadata (size, content-type) from storage. */
21
+ abstract getObjectMetadata(key: string): Promise<ObjectMetadata | null>;
22
+ /** Deletes an object from storage. */
23
+ abstract deleteObject(key: string): Promise<void>;
24
+ /** Builds a standardized object key: {tenant}/{dataContext}/{uuid}/{fileName} */
25
+ abstract buildObjectKey(opts: UploadOptions): string;
26
+ /** @deprecated Use generateSignedUrl for read or direct client-side upload */
2
27
  abstract upload(bucketName: string, filePath: string, data: Buffer, contentType?: string): Promise<string>;
28
+ /** @deprecated Use generateSignedUrl and fetch client-side */
3
29
  abstract download(bucketName: string, filePath: string): Promise<Buffer>;
30
+ /** @deprecated Use deleteObject */
4
31
  abstract delete(bucketName: string, filePath: string): Promise<void>;
32
+ /** @deprecated Use generateSignedUrl */
5
33
  abstract getSignedUrl(bucketName: string, filePath: string, expiresMs: number): Promise<string>;
6
34
  }
7
35
  //# sourceMappingURL=StorageProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":"AAAA,8BAAsB,eAAe;IACnC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1G,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxE,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACpE,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAChG"}
1
+ {"version":3,"file":"StorageProvider.d.ts","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IACxB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,8BAAsB,eAAe;IACnC,qDAAqD;IACrD,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IAEhF,mEAAmE;IACnE,QAAQ,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAEvE,sCAAsC;IACtC,QAAQ,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAEjD,iFAAiF;IACjF,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAEpD,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC1G,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxE,mCAAmC;IACnC,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IACpE,wCAAwC;IACxC,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAChG"}
@@ -1 +1 @@
1
- {"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":"AAAA,MAAM,OAAgB,eAAe;CAKpC"}
1
+ {"version":3,"file":"StorageProvider.js","sourceRoot":"","sources":["../../src/storage/StorageProvider.ts"],"names":[],"mappings":"AAmBA,MAAM,OAAgB,eAAe;CAqBpC"}
@@ -1,2 +1,6 @@
1
- export { StorageProvider } from "./StorageProvider.js";
1
+ export { StorageProvider, type UploadOptions, type SignedUrlOptions, type ObjectMetadata } from "./StorageProvider.js";
2
+ export { Anexo } from "./AnexoEntity.js";
3
+ export { AnexoRepository } from "./AnexoRepository.js";
4
+ export { AnexoService } from "./AnexoService.js";
5
+ export { AnexoController } from "./AnexoController.js";
2
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACtH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
@@ -1,2 +1,6 @@
1
1
  export { StorageProvider } from "./StorageProvider.js";
2
+ export { Anexo } from "./AnexoEntity.js";
3
+ export { AnexoRepository } from "./AnexoRepository.js";
4
+ export { AnexoService } from "./AnexoService.js";
5
+ export { AnexoController } from "./AnexoController.js";
2
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAkE,MAAM,sBAAsB,CAAA;AACtH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}