@punks/backend-entity-manager 0.0.121 → 0.0.122

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 (48) hide show
  1. package/dist/cjs/index.js +248 -7
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/abstractions/files.d.ts +64 -0
  4. package/dist/cjs/types/abstractions/index.d.ts +1 -0
  5. package/dist/cjs/types/abstractions/settings.d.ts +2 -1
  6. package/dist/cjs/types/platforms/nest/__test__/server/database/core/entities/appFileReference.entity.d.ts +13 -0
  7. package/dist/cjs/types/platforms/nest/__test__/server/database/core/index.d.ts +4 -0
  8. package/dist/cjs/types/platforms/nest/__test__/server/database/core/repositories/appFileReference.repository.d.ts +11 -0
  9. package/dist/cjs/types/platforms/nest/__test__/server/database/core/repositories.d.ts +2 -1
  10. package/dist/cjs/types/platforms/nest/decorators/files.d.ts +7 -0
  11. package/dist/cjs/types/platforms/nest/decorators/symbols.d.ts +2 -0
  12. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/index.d.ts +1 -1
  13. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/bucket.d.ts +14 -0
  14. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/files.d.ts +12 -0
  15. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/index.d.ts +2 -14
  16. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/settings/index.d.ts +5 -0
  17. package/dist/cjs/types/platforms/nest/plugins/buckets/testing/mock.d.ts +10 -0
  18. package/dist/cjs/types/platforms/nest/processors/initializer/index.d.ts +4 -0
  19. package/dist/cjs/types/platforms/nest/services/files/index.d.ts +12 -0
  20. package/dist/cjs/types/platforms/nest/services/index.d.ts +1 -0
  21. package/dist/cjs/types/platforms/nest/services/providers.d.ts +2 -1
  22. package/dist/cjs/types/providers/services.d.ts +8 -3
  23. package/dist/cjs/types/symbols/ioc.d.ts +4 -0
  24. package/dist/esm/index.js +250 -9
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/types/abstractions/files.d.ts +64 -0
  27. package/dist/esm/types/abstractions/index.d.ts +1 -0
  28. package/dist/esm/types/abstractions/settings.d.ts +2 -1
  29. package/dist/esm/types/platforms/nest/__test__/server/database/core/entities/appFileReference.entity.d.ts +13 -0
  30. package/dist/esm/types/platforms/nest/__test__/server/database/core/index.d.ts +4 -0
  31. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories/appFileReference.repository.d.ts +11 -0
  32. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories.d.ts +2 -1
  33. package/dist/esm/types/platforms/nest/decorators/files.d.ts +7 -0
  34. package/dist/esm/types/platforms/nest/decorators/symbols.d.ts +2 -0
  35. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/index.d.ts +1 -1
  36. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/bucket.d.ts +14 -0
  37. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/files.d.ts +12 -0
  38. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/index.d.ts +2 -14
  39. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/settings/index.d.ts +5 -0
  40. package/dist/esm/types/platforms/nest/plugins/buckets/testing/mock.d.ts +10 -0
  41. package/dist/esm/types/platforms/nest/processors/initializer/index.d.ts +4 -0
  42. package/dist/esm/types/platforms/nest/services/files/index.d.ts +12 -0
  43. package/dist/esm/types/platforms/nest/services/index.d.ts +1 -0
  44. package/dist/esm/types/platforms/nest/services/providers.d.ts +2 -1
  45. package/dist/esm/types/providers/services.d.ts +8 -3
  46. package/dist/esm/types/symbols/ioc.d.ts +4 -0
  47. package/dist/index.d.ts +96 -4
  48. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -627,7 +627,7 @@ class EntitiesDeleteCommand {
627
627
  }
628
628
  }
629
629
 
630
- const createDayPath = (d) => `${d.getFullYear()}/${(d.getMonth() + 1).toString().padStart(2, "0")}/${d
630
+ const createDayPath$1 = (d) => `${d.getFullYear()}/${(d.getMonth() + 1).toString().padStart(2, "0")}/${d
631
631
  .getDate()
632
632
  .toString()
633
633
  .padStart(2, "0")}`;
@@ -666,7 +666,7 @@ class EntitiesExportCommand {
666
666
  });
667
667
  }
668
668
  buildAbsoluteBucketPath(relativePath) {
669
- return `${this.settings.exportBucket.rootFolderPath ?? ""}/exports/${createDayPath(new Date())}/${relativePath}`;
669
+ return `${this.settings.exportBucket.rootFolderPath ?? ""}/exports/${createDayPath$1(new Date())}/${relativePath}`;
670
670
  }
671
671
  async getExportEntities(filters) {
672
672
  return this.services.resolveSearchQuery().execute(filters ?? {});
@@ -723,7 +723,7 @@ class EntitiesImportCommand {
723
723
  });
724
724
  }
725
725
  buildAbsoluteBucketPath(relativePath) {
726
- return `${this.settings.exportBucket.rootFolderPath ?? ""}/imports/${createDayPath(new Date())}/${relativePath}`;
726
+ return `${this.settings.exportBucket.rootFolderPath ?? ""}/imports/${createDayPath$1(new Date())}/${relativePath}`;
727
727
  }
728
728
  get bucket() {
729
729
  return this.services.getRootServices().resolveDefaultBucketProvider();
@@ -763,7 +763,7 @@ class EntitiesSampleDownloadCommand {
763
763
  });
764
764
  }
765
765
  buildAbsoluteBucketPath(relativePath) {
766
- return `${this.settings.exportBucket.rootFolderPath ?? ""}/samples/${createDayPath(new Date())}/${relativePath}`;
766
+ return `${this.settings.exportBucket.rootFolderPath ?? ""}/samples/${createDayPath$1(new Date())}/${relativePath}`;
767
767
  }
768
768
  get bucket() {
769
769
  return this.services.getRootServices().resolveDefaultBucketProvider();
@@ -1124,6 +1124,9 @@ const EntityServices = {
1124
1124
  },
1125
1125
  };
1126
1126
  const GlobalServices = {
1127
+ Files: {
1128
+ IFilesReferenceRepo: "IFilesReferenceRepo",
1129
+ },
1127
1130
  Events: {
1128
1131
  IEventEmitter: "IEventEmitter",
1129
1132
  IEventsTracker: "IEventsTracker",
@@ -1138,6 +1141,7 @@ const GlobalServices = {
1138
1141
  IEmailProvider: "IEmailProvider",
1139
1142
  IEmailTemplatesCollection: "IEmailTemplatesCollection",
1140
1143
  IBucketProvider: "IBucketProvider",
1144
+ IFileProvider: "IFileProvider",
1141
1145
  },
1142
1146
  Settings: {
1143
1147
  EntityManagerSettings: "EntityManagerSettings",
@@ -1327,13 +1331,31 @@ class EntitiesServiceLocator {
1327
1331
  }
1328
1332
  resolveDefaultBucketProvider() {
1329
1333
  const settings = this.resolveSettings();
1330
- return this.provider.resolveMultipleNamed(GlobalServices.Plugins.IBucketProvider, settings.defaultBuckerProvider);
1334
+ return this.provider.resolveMultipleNamed(GlobalServices.Plugins.IBucketProvider, settings.defaultBucketProvider);
1335
+ }
1336
+ resolveDefaultFilesProvider() {
1337
+ const settings = this.resolveSettings();
1338
+ return this.provider.resolveMultipleNamed(GlobalServices.Plugins.IFileProvider, settings.defaultFilesProvider);
1331
1339
  }
1332
1340
  resolveBucketProviders() {
1333
- return this.provider.resolveMultiple(GlobalServices.Plugins.IBucketProvider);
1341
+ return this.provider.resolveMultiple(GlobalServices.Plugins.IFileProvider);
1334
1342
  }
1335
1343
  registerBucketProvider(name, instance) {
1336
1344
  this.provider.registerMultiple(GlobalServices.Plugins.IBucketProvider, name, instance);
1345
+ return this;
1346
+ }
1347
+ resolveFileProvider(providerId) {
1348
+ return this.provider.resolveMultipleNamed(GlobalServices.Plugins.IFileProvider, providerId);
1349
+ }
1350
+ registerFileProvider(name, instance) {
1351
+ this.provider.registerMultiple(GlobalServices.Plugins.IFileProvider, name, instance);
1352
+ return this;
1353
+ }
1354
+ resolveFilesReferenceRepositoryProviders() {
1355
+ return this.provider.resolve(GlobalServices.Files.IFilesReferenceRepo);
1356
+ }
1357
+ registerFilesReferenceRepositoryProviders(instance) {
1358
+ this.provider.register(GlobalServices.Files.IFilesReferenceRepo, instance);
1337
1359
  }
1338
1360
  resolveEventsTracker() {
1339
1361
  return this.provider.resolve(GlobalServices.Events.IEventsTracker);
@@ -2219,6 +2241,8 @@ const EntityManagerSymbols = {
2219
2241
  EmailProvider: Symbol.for("WP:EMAIL_PROVIDER"),
2220
2242
  EmailTemplate: Symbol.for("WP:EMAIL_TEMPLATE"),
2221
2243
  BucketProvider: Symbol.for("WP:BUCKET_PROVIDER"),
2244
+ FileProvider: Symbol.for("WP:FILE_PROVIDER"),
2245
+ FileReferenceRepository: Symbol.for("WP:FILE_REFERENCE_REPO"),
2222
2246
  PipelineTemplate: Symbol.for("WP:PIPELINE_TEMPLATE"),
2223
2247
  };
2224
2248
 
@@ -20173,6 +20197,79 @@ exports.EmailService = __decorate([
20173
20197
  __metadata("design:paramtypes", [exports.EntityManagerRegistry])
20174
20198
  ], exports.EmailService);
20175
20199
 
20200
+ exports.FilesService = class FilesService {
20201
+ constructor(registry) {
20202
+ this.registry = registry;
20203
+ }
20204
+ async uploadFile(file) {
20205
+ const uploadResult = await this.defaultFileProvider.uploadFile({
20206
+ content: file.content,
20207
+ contentType: file.contentType,
20208
+ fileName: file.fileName,
20209
+ });
20210
+ const record = await this.referencesRepo.createReference({
20211
+ providerId: uploadResult.reference,
20212
+ reference: uploadResult.reference,
20213
+ contentType: file.contentType,
20214
+ fileName: file.fileName,
20215
+ filePath: file.folderPath,
20216
+ fileSize: file.content.length,
20217
+ metadata: file.metadata,
20218
+ });
20219
+ return {
20220
+ fileId: record.fileId,
20221
+ providerId: record.providerId,
20222
+ reference: record.reference,
20223
+ };
20224
+ }
20225
+ async getFileContent(fileId) {
20226
+ const ref = await this.referencesRepo.getReference(fileId);
20227
+ const content = await this.getFileProvider(ref.providerId).downloadFile({
20228
+ reference: ref.reference,
20229
+ });
20230
+ return {
20231
+ content: content.content,
20232
+ contentType: ref.contentType,
20233
+ fileName: ref.fileName,
20234
+ folderPath: ref.filePath,
20235
+ metadata: ref.metadata,
20236
+ };
20237
+ }
20238
+ async getFileDownloadUrl(fileId) {
20239
+ const ref = await this.referencesRepo.getReference(fileId);
20240
+ const downloadUrl = await this.getFileProvider(ref.providerId).getFileProviderDownloadUrl({
20241
+ reference: ref.reference,
20242
+ });
20243
+ return {
20244
+ contentType: ref.contentType,
20245
+ fileName: ref.fileName,
20246
+ downloadUrl: downloadUrl.downloadUrl,
20247
+ };
20248
+ }
20249
+ getFileProvider(providerId) {
20250
+ return this.registry
20251
+ .getContainer()
20252
+ .getEntitiesServicesLocator()
20253
+ .resolveFileProvider(providerId);
20254
+ }
20255
+ get defaultFileProvider() {
20256
+ return this.registry
20257
+ .getContainer()
20258
+ .getEntitiesServicesLocator()
20259
+ .resolveDefaultFilesProvider();
20260
+ }
20261
+ get referencesRepo() {
20262
+ return this.registry
20263
+ .getContainer()
20264
+ .getEntitiesServicesLocator()
20265
+ .resolveFilesReferenceRepositoryProviders();
20266
+ }
20267
+ };
20268
+ exports.FilesService = __decorate([
20269
+ common.Injectable(),
20270
+ __metadata("design:paramtypes", [exports.EntityManagerRegistry])
20271
+ ], exports.FilesService);
20272
+
20176
20273
  exports.EventsService = class EventsService {
20177
20274
  constructor(registry) {
20178
20275
  this.registry = registry;
@@ -20903,6 +21000,7 @@ const Services$1 = [
20903
21000
  exports.EntityManagerService,
20904
21001
  exports.EmailService,
20905
21002
  exports.EventsService,
21003
+ exports.FilesService,
20906
21004
  exports.TrackingService,
20907
21005
  ];
20908
21006
 
@@ -21202,6 +21300,8 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21202
21300
  await this.registerEmailProviders();
21203
21301
  await this.registerEventTrackingProviders();
21204
21302
  await this.registerVersioningProviders();
21303
+ await this.registerFilesReferenceRepositoryProviders();
21304
+ await this.registerFileProviders();
21205
21305
  await this.registerBucketProviders();
21206
21306
  await this.executeInitializers(app);
21207
21307
  await this.executeSeeders();
@@ -21287,6 +21387,20 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21287
21387
  this.logger.log(`Entity seeder initializer ${initializer.discoveredClass.name} initialized 💪`);
21288
21388
  }
21289
21389
  }
21390
+ async registerFileProviders() {
21391
+ const providers = await this.discoverFileProviders();
21392
+ if (!providers.length) {
21393
+ this.logger.warn("No file providers found ⚠️");
21394
+ return;
21395
+ }
21396
+ for (const provider of providers) {
21397
+ this.registry
21398
+ .getContainer()
21399
+ .getEntitiesServicesLocator()
21400
+ .registerFileProvider(provider.meta.providerId, provider.discoveredClass.instance);
21401
+ this.logger.log(`File provider ${provider.discoveredClass.name} registered 🚜`);
21402
+ }
21403
+ }
21290
21404
  async registerBucketProviders() {
21291
21405
  const providers = await this.discoverBucketProviders();
21292
21406
  if (!providers.length) {
@@ -21301,6 +21415,18 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21301
21415
  this.logger.log(`Bucket provider ${provider.discoveredClass.name} registered 🚜`);
21302
21416
  }
21303
21417
  }
21418
+ async registerFilesReferenceRepositoryProviders() {
21419
+ const providers = await this.discoverFilesReferenceRepositoryProviders();
21420
+ if (!providers.length) {
21421
+ this.logger.warn("No files repository ⚠️");
21422
+ return;
21423
+ }
21424
+ this.registry
21425
+ .getContainer()
21426
+ .getEntitiesServicesLocator()
21427
+ .registerFilesReferenceRepositoryProviders(providers[0].discoveredClass.instance);
21428
+ this.logger.log(`Files Reference Repository ${providers[0].discoveredClass.name} registered 🚜`);
21429
+ }
21304
21430
  async registerEventTrackingProviders() {
21305
21431
  const providers = await this.discoverEventTrackingProviders();
21306
21432
  if (!providers.length) {
@@ -21405,6 +21531,12 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21405
21531
  async discoverBucketProviders() {
21406
21532
  return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.BucketProvider);
21407
21533
  }
21534
+ async discoverFileProviders() {
21535
+ return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.FileProvider);
21536
+ }
21537
+ async discoverFilesReferenceRepositoryProviders() {
21538
+ return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.FileReferenceRepository);
21539
+ }
21408
21540
  };
21409
21541
  exports.EntityManagerInitializer = EntityManagerInitializer_1 = __decorate([
21410
21542
  common.Injectable(),
@@ -22452,9 +22584,70 @@ exports.AwsS3BucketProvider = __decorate([
22452
22584
  __metadata("design:paramtypes", [])
22453
22585
  ], exports.AwsS3BucketProvider);
22454
22586
 
22587
+ const WpFileProvider = (providerId) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.FileProvider, {
22588
+ providerId,
22589
+ }));
22590
+
22591
+ const createDayPath = (d) => `${d.getFullYear()}/${(d.getMonth() + 1).toString().padStart(2, "0")}/${d
22592
+ .getDate()
22593
+ .toString()
22594
+ .padStart(2, "0")}`;
22595
+ let AwsS3FileProvider = class AwsS3FileProvider {
22596
+ constructor(bucket) {
22597
+ this.bucket = bucket;
22598
+ }
22599
+ getProviderId() {
22600
+ return "awsS3";
22601
+ }
22602
+ async uploadFile(file) {
22603
+ const path = this.getBucketFileUploadPath(file.fileName, new Date());
22604
+ await this.bucket.fileUpload({
22605
+ bucket: awsBucketSettings.value.defaultBucket,
22606
+ filePath: path,
22607
+ content: file.content,
22608
+ contentType: file.contentType,
22609
+ });
22610
+ return {
22611
+ reference: path,
22612
+ };
22613
+ }
22614
+ async deleteFile(reference) {
22615
+ await this.bucket.fileDelete({
22616
+ bucket: awsBucketSettings.value.defaultBucket,
22617
+ filePath: reference.reference,
22618
+ });
22619
+ }
22620
+ async downloadFile(reference) {
22621
+ const content = await this.bucket.fileDownload({
22622
+ bucket: awsBucketSettings.value.defaultBucket,
22623
+ filePath: reference.reference,
22624
+ });
22625
+ return {
22626
+ content,
22627
+ };
22628
+ }
22629
+ async getFileProviderDownloadUrl(reference) {
22630
+ const url = await this.bucket.filePublicUrlCreate({
22631
+ bucket: awsBucketSettings.value.defaultBucket,
22632
+ expirationMinutes: awsBucketSettings.value.publicLinksExpirationMinutes,
22633
+ filePath: reference.reference,
22634
+ });
22635
+ return {
22636
+ downloadUrl: url,
22637
+ };
22638
+ }
22639
+ getBucketFileUploadPath(fileName, date) {
22640
+ return `${backendCore.ensureTailingSlash(awsBucketSettings.value.paths.filesUpload)}${createDayPath(date)}${backendCore.ensureStartSlash(backendCore.newUuid())}_${fileName}`;
22641
+ }
22642
+ };
22643
+ AwsS3FileProvider = __decorate([
22644
+ WpFileProvider("awsS3"),
22645
+ __metadata("design:paramtypes", [exports.AwsS3BucketProvider])
22646
+ ], AwsS3FileProvider);
22647
+
22455
22648
  var AwsBucketModule_1;
22456
22649
  const ModuleData$2 = {
22457
- providers: [exports.AwsS3BucketProvider],
22650
+ providers: [exports.AwsS3BucketProvider, AwsS3FileProvider],
22458
22651
  };
22459
22652
  exports.AwsBucketModule = AwsBucketModule_1 = class AwsBucketModule {
22460
22653
  static forRoot(input) {
@@ -22471,6 +22664,54 @@ exports.AwsBucketModule = AwsBucketModule_1 = __decorate([
22471
22664
  })
22472
22665
  ], exports.AwsBucketModule);
22473
22666
 
22667
+ let InMemoryFileProvider = class InMemoryFileProvider {
22668
+ constructor() {
22669
+ this.provider = new exports.InMemoryBucketProvider();
22670
+ }
22671
+ getProviderId() {
22672
+ return "inMemory";
22673
+ }
22674
+ async uploadFile(file) {
22675
+ const filePath = `${backendCore.newUuid()}/${file.fileName}`;
22676
+ await this.provider.fileUpload({
22677
+ bucket: "test",
22678
+ content: file.content,
22679
+ contentType: file.contentType,
22680
+ filePath,
22681
+ });
22682
+ return {
22683
+ reference: filePath,
22684
+ };
22685
+ }
22686
+ async deleteFile(reference) {
22687
+ await this.provider.fileDelete({
22688
+ bucket: "test",
22689
+ filePath: reference.reference,
22690
+ });
22691
+ }
22692
+ async downloadFile(reference) {
22693
+ const content = await this.provider.fileDownload({
22694
+ bucket: "test",
22695
+ filePath: reference.reference,
22696
+ });
22697
+ return {
22698
+ content,
22699
+ };
22700
+ }
22701
+ async getFileProviderDownloadUrl(reference) {
22702
+ return {
22703
+ downloadUrl: await this.provider.filePublicUrlCreate({
22704
+ bucket: "test",
22705
+ filePath: reference.reference,
22706
+ expirationMinutes: 60,
22707
+ }),
22708
+ };
22709
+ }
22710
+ };
22711
+ InMemoryFileProvider = __decorate([
22712
+ WpFileProvider("inMemory"),
22713
+ __metadata("design:paramtypes", [])
22714
+ ], InMemoryFileProvider);
22474
22715
  exports.InMemoryBucketProvider = class InMemoryBucketProvider {
22475
22716
  constructor() {
22476
22717
  this.inMemoryStorage = {};