@punks/backend-entity-manager 0.0.121 → 0.0.123

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 (50) hide show
  1. package/dist/cjs/index.js +251 -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/index.d.ts +1 -0
  12. package/dist/cjs/types/platforms/nest/decorators/symbols.d.ts +2 -0
  13. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/index.d.ts +1 -1
  14. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/bucket.d.ts +14 -0
  15. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/files.d.ts +12 -0
  16. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/provider/index.d.ts +2 -14
  17. package/dist/cjs/types/platforms/nest/plugins/buckets/aws-s3/settings/index.d.ts +5 -0
  18. package/dist/cjs/types/platforms/nest/plugins/buckets/testing/mock.d.ts +10 -0
  19. package/dist/cjs/types/platforms/nest/processors/initializer/index.d.ts +4 -0
  20. package/dist/cjs/types/platforms/nest/services/files/index.d.ts +12 -0
  21. package/dist/cjs/types/platforms/nest/services/index.d.ts +1 -0
  22. package/dist/cjs/types/platforms/nest/services/providers.d.ts +2 -1
  23. package/dist/cjs/types/providers/services.d.ts +8 -3
  24. package/dist/cjs/types/symbols/ioc.d.ts +4 -0
  25. package/dist/esm/index.js +251 -9
  26. package/dist/esm/index.js.map +1 -1
  27. package/dist/esm/types/abstractions/files.d.ts +64 -0
  28. package/dist/esm/types/abstractions/index.d.ts +1 -0
  29. package/dist/esm/types/abstractions/settings.d.ts +2 -1
  30. package/dist/esm/types/platforms/nest/__test__/server/database/core/entities/appFileReference.entity.d.ts +13 -0
  31. package/dist/esm/types/platforms/nest/__test__/server/database/core/index.d.ts +4 -0
  32. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories/appFileReference.repository.d.ts +11 -0
  33. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories.d.ts +2 -1
  34. package/dist/esm/types/platforms/nest/decorators/files.d.ts +7 -0
  35. package/dist/esm/types/platforms/nest/decorators/index.d.ts +1 -0
  36. package/dist/esm/types/platforms/nest/decorators/symbols.d.ts +2 -0
  37. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/index.d.ts +1 -1
  38. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/bucket.d.ts +14 -0
  39. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/files.d.ts +12 -0
  40. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/provider/index.d.ts +2 -14
  41. package/dist/esm/types/platforms/nest/plugins/buckets/aws-s3/settings/index.d.ts +5 -0
  42. package/dist/esm/types/platforms/nest/plugins/buckets/testing/mock.d.ts +10 -0
  43. package/dist/esm/types/platforms/nest/processors/initializer/index.d.ts +4 -0
  44. package/dist/esm/types/platforms/nest/services/files/index.d.ts +12 -0
  45. package/dist/esm/types/platforms/nest/services/index.d.ts +1 -0
  46. package/dist/esm/types/platforms/nest/services/providers.d.ts +2 -1
  47. package/dist/esm/types/providers/services.d.ts +8 -3
  48. package/dist/esm/types/symbols/ioc.d.ts +4 -0
  49. package/dist/index.d.ts +104 -4
  50. 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
 
@@ -2263,6 +2287,11 @@ const WpEntity = (name, props = {}) => common.applyDecorators(common.SetMetadata
2263
2287
  ...props,
2264
2288
  }));
2265
2289
 
2290
+ const WpFileProvider = (providerId) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.FileProvider, {
2291
+ providerId,
2292
+ }));
2293
+ const WpFileReferenceRepository = () => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.FileReferenceRepository, true));
2294
+
2266
2295
  const WpAppInitializer = (props = {}) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.AppInitializer, props));
2267
2296
 
2268
2297
  const WpEntityRepository = (entityName, props = {}) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.EntityRepository, {
@@ -20173,6 +20202,79 @@ exports.EmailService = __decorate([
20173
20202
  __metadata("design:paramtypes", [exports.EntityManagerRegistry])
20174
20203
  ], exports.EmailService);
20175
20204
 
20205
+ exports.FilesService = class FilesService {
20206
+ constructor(registry) {
20207
+ this.registry = registry;
20208
+ }
20209
+ async uploadFile(file) {
20210
+ const uploadResult = await this.defaultFileProvider.uploadFile({
20211
+ content: file.content,
20212
+ contentType: file.contentType,
20213
+ fileName: file.fileName,
20214
+ });
20215
+ const record = await this.referencesRepo.createReference({
20216
+ providerId: uploadResult.reference,
20217
+ reference: uploadResult.reference,
20218
+ contentType: file.contentType,
20219
+ fileName: file.fileName,
20220
+ filePath: file.folderPath,
20221
+ fileSize: file.content.length,
20222
+ metadata: file.metadata,
20223
+ });
20224
+ return {
20225
+ fileId: record.fileId,
20226
+ providerId: record.providerId,
20227
+ reference: record.reference,
20228
+ };
20229
+ }
20230
+ async getFileContent(fileId) {
20231
+ const ref = await this.referencesRepo.getReference(fileId);
20232
+ const content = await this.getFileProvider(ref.providerId).downloadFile({
20233
+ reference: ref.reference,
20234
+ });
20235
+ return {
20236
+ content: content.content,
20237
+ contentType: ref.contentType,
20238
+ fileName: ref.fileName,
20239
+ folderPath: ref.filePath,
20240
+ metadata: ref.metadata,
20241
+ };
20242
+ }
20243
+ async getFileDownloadUrl(fileId) {
20244
+ const ref = await this.referencesRepo.getReference(fileId);
20245
+ const downloadUrl = await this.getFileProvider(ref.providerId).getFileProviderDownloadUrl({
20246
+ reference: ref.reference,
20247
+ });
20248
+ return {
20249
+ contentType: ref.contentType,
20250
+ fileName: ref.fileName,
20251
+ downloadUrl: downloadUrl.downloadUrl,
20252
+ };
20253
+ }
20254
+ getFileProvider(providerId) {
20255
+ return this.registry
20256
+ .getContainer()
20257
+ .getEntitiesServicesLocator()
20258
+ .resolveFileProvider(providerId);
20259
+ }
20260
+ get defaultFileProvider() {
20261
+ return this.registry
20262
+ .getContainer()
20263
+ .getEntitiesServicesLocator()
20264
+ .resolveDefaultFilesProvider();
20265
+ }
20266
+ get referencesRepo() {
20267
+ return this.registry
20268
+ .getContainer()
20269
+ .getEntitiesServicesLocator()
20270
+ .resolveFilesReferenceRepositoryProviders();
20271
+ }
20272
+ };
20273
+ exports.FilesService = __decorate([
20274
+ common.Injectable(),
20275
+ __metadata("design:paramtypes", [exports.EntityManagerRegistry])
20276
+ ], exports.FilesService);
20277
+
20176
20278
  exports.EventsService = class EventsService {
20177
20279
  constructor(registry) {
20178
20280
  this.registry = registry;
@@ -20903,6 +21005,7 @@ const Services$1 = [
20903
21005
  exports.EntityManagerService,
20904
21006
  exports.EmailService,
20905
21007
  exports.EventsService,
21008
+ exports.FilesService,
20906
21009
  exports.TrackingService,
20907
21010
  ];
20908
21011
 
@@ -21202,6 +21305,8 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21202
21305
  await this.registerEmailProviders();
21203
21306
  await this.registerEventTrackingProviders();
21204
21307
  await this.registerVersioningProviders();
21308
+ await this.registerFilesReferenceRepositoryProviders();
21309
+ await this.registerFileProviders();
21205
21310
  await this.registerBucketProviders();
21206
21311
  await this.executeInitializers(app);
21207
21312
  await this.executeSeeders();
@@ -21287,6 +21392,20 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21287
21392
  this.logger.log(`Entity seeder initializer ${initializer.discoveredClass.name} initialized 💪`);
21288
21393
  }
21289
21394
  }
21395
+ async registerFileProviders() {
21396
+ const providers = await this.discoverFileProviders();
21397
+ if (!providers.length) {
21398
+ this.logger.warn("No file providers found ⚠️");
21399
+ return;
21400
+ }
21401
+ for (const provider of providers) {
21402
+ this.registry
21403
+ .getContainer()
21404
+ .getEntitiesServicesLocator()
21405
+ .registerFileProvider(provider.meta.providerId, provider.discoveredClass.instance);
21406
+ this.logger.log(`File provider ${provider.discoveredClass.name} registered 🚜`);
21407
+ }
21408
+ }
21290
21409
  async registerBucketProviders() {
21291
21410
  const providers = await this.discoverBucketProviders();
21292
21411
  if (!providers.length) {
@@ -21301,6 +21420,18 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21301
21420
  this.logger.log(`Bucket provider ${provider.discoveredClass.name} registered 🚜`);
21302
21421
  }
21303
21422
  }
21423
+ async registerFilesReferenceRepositoryProviders() {
21424
+ const providers = await this.discoverFilesReferenceRepositoryProviders();
21425
+ if (!providers.length) {
21426
+ this.logger.warn("No files repository ⚠️");
21427
+ return;
21428
+ }
21429
+ this.registry
21430
+ .getContainer()
21431
+ .getEntitiesServicesLocator()
21432
+ .registerFilesReferenceRepositoryProviders(providers[0].discoveredClass.instance);
21433
+ this.logger.log(`Files Reference Repository ${providers[0].discoveredClass.name} registered 🚜`);
21434
+ }
21304
21435
  async registerEventTrackingProviders() {
21305
21436
  const providers = await this.discoverEventTrackingProviders();
21306
21437
  if (!providers.length) {
@@ -21405,6 +21536,12 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21405
21536
  async discoverBucketProviders() {
21406
21537
  return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.BucketProvider);
21407
21538
  }
21539
+ async discoverFileProviders() {
21540
+ return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.FileProvider);
21541
+ }
21542
+ async discoverFilesReferenceRepositoryProviders() {
21543
+ return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.FileReferenceRepository);
21544
+ }
21408
21545
  };
21409
21546
  exports.EntityManagerInitializer = EntityManagerInitializer_1 = __decorate([
21410
21547
  common.Injectable(),
@@ -22452,9 +22589,66 @@ exports.AwsS3BucketProvider = __decorate([
22452
22589
  __metadata("design:paramtypes", [])
22453
22590
  ], exports.AwsS3BucketProvider);
22454
22591
 
22592
+ const createDayPath = (d) => `${d.getFullYear()}/${(d.getMonth() + 1).toString().padStart(2, "0")}/${d
22593
+ .getDate()
22594
+ .toString()
22595
+ .padStart(2, "0")}`;
22596
+ let AwsS3FileProvider = class AwsS3FileProvider {
22597
+ constructor(bucket) {
22598
+ this.bucket = bucket;
22599
+ }
22600
+ getProviderId() {
22601
+ return "awsS3";
22602
+ }
22603
+ async uploadFile(file) {
22604
+ const path = this.getBucketFileUploadPath(file.fileName, new Date());
22605
+ await this.bucket.fileUpload({
22606
+ bucket: awsBucketSettings.value.defaultBucket,
22607
+ filePath: path,
22608
+ content: file.content,
22609
+ contentType: file.contentType,
22610
+ });
22611
+ return {
22612
+ reference: path,
22613
+ };
22614
+ }
22615
+ async deleteFile(reference) {
22616
+ await this.bucket.fileDelete({
22617
+ bucket: awsBucketSettings.value.defaultBucket,
22618
+ filePath: reference.reference,
22619
+ });
22620
+ }
22621
+ async downloadFile(reference) {
22622
+ const content = await this.bucket.fileDownload({
22623
+ bucket: awsBucketSettings.value.defaultBucket,
22624
+ filePath: reference.reference,
22625
+ });
22626
+ return {
22627
+ content,
22628
+ };
22629
+ }
22630
+ async getFileProviderDownloadUrl(reference) {
22631
+ const url = await this.bucket.filePublicUrlCreate({
22632
+ bucket: awsBucketSettings.value.defaultBucket,
22633
+ expirationMinutes: awsBucketSettings.value.publicLinksExpirationMinutes,
22634
+ filePath: reference.reference,
22635
+ });
22636
+ return {
22637
+ downloadUrl: url,
22638
+ };
22639
+ }
22640
+ getBucketFileUploadPath(fileName, date) {
22641
+ return `${backendCore.ensureTailingSlash(awsBucketSettings.value.paths.filesUpload)}${createDayPath(date)}${backendCore.ensureStartSlash(backendCore.newUuid())}_${fileName}`;
22642
+ }
22643
+ };
22644
+ AwsS3FileProvider = __decorate([
22645
+ WpFileProvider("awsS3"),
22646
+ __metadata("design:paramtypes", [exports.AwsS3BucketProvider])
22647
+ ], AwsS3FileProvider);
22648
+
22455
22649
  var AwsBucketModule_1;
22456
22650
  const ModuleData$2 = {
22457
- providers: [exports.AwsS3BucketProvider],
22651
+ providers: [exports.AwsS3BucketProvider, AwsS3FileProvider],
22458
22652
  };
22459
22653
  exports.AwsBucketModule = AwsBucketModule_1 = class AwsBucketModule {
22460
22654
  static forRoot(input) {
@@ -22471,6 +22665,54 @@ exports.AwsBucketModule = AwsBucketModule_1 = __decorate([
22471
22665
  })
22472
22666
  ], exports.AwsBucketModule);
22473
22667
 
22668
+ let InMemoryFileProvider = class InMemoryFileProvider {
22669
+ constructor() {
22670
+ this.provider = new exports.InMemoryBucketProvider();
22671
+ }
22672
+ getProviderId() {
22673
+ return "inMemory";
22674
+ }
22675
+ async uploadFile(file) {
22676
+ const filePath = `${backendCore.newUuid()}/${file.fileName}`;
22677
+ await this.provider.fileUpload({
22678
+ bucket: "test",
22679
+ content: file.content,
22680
+ contentType: file.contentType,
22681
+ filePath,
22682
+ });
22683
+ return {
22684
+ reference: filePath,
22685
+ };
22686
+ }
22687
+ async deleteFile(reference) {
22688
+ await this.provider.fileDelete({
22689
+ bucket: "test",
22690
+ filePath: reference.reference,
22691
+ });
22692
+ }
22693
+ async downloadFile(reference) {
22694
+ const content = await this.provider.fileDownload({
22695
+ bucket: "test",
22696
+ filePath: reference.reference,
22697
+ });
22698
+ return {
22699
+ content,
22700
+ };
22701
+ }
22702
+ async getFileProviderDownloadUrl(reference) {
22703
+ return {
22704
+ downloadUrl: await this.provider.filePublicUrlCreate({
22705
+ bucket: "test",
22706
+ filePath: reference.reference,
22707
+ expirationMinutes: 60,
22708
+ }),
22709
+ };
22710
+ }
22711
+ };
22712
+ InMemoryFileProvider = __decorate([
22713
+ WpFileProvider("inMemory"),
22714
+ __metadata("design:paramtypes", [])
22715
+ ], InMemoryFileProvider);
22474
22716
  exports.InMemoryBucketProvider = class InMemoryBucketProvider {
22475
22717
  constructor() {
22476
22718
  this.inMemoryStorage = {};
@@ -27837,6 +28079,8 @@ exports.WpEntitySeeder = WpEntitySeeder;
27837
28079
  exports.WpEntitySerializer = WpEntitySerializer;
27838
28080
  exports.WpEntityVersioningProvider = WpEntityVersioningProvider;
27839
28081
  exports.WpEventsTracker = WpEventsTracker;
28082
+ exports.WpFileProvider = WpFileProvider;
28083
+ exports.WpFileReferenceRepository = WpFileReferenceRepository;
27840
28084
  exports.WpPipeline = WpPipeline;
27841
28085
  exports.WpRolesService = WpRolesService;
27842
28086
  exports.WpSendgridEmailTemplate = WpSendgridEmailTemplate;