@punks/backend-entity-manager 0.0.137 → 0.0.139

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 (40) hide show
  1. package/dist/cjs/index.js +69 -5
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/abstractions/configuration.d.ts +2 -0
  4. package/dist/cjs/types/abstractions/index.d.ts +1 -0
  5. package/dist/cjs/types/abstractions/snapshot.d.ts +3 -0
  6. package/dist/cjs/types/base/index.d.ts +1 -0
  7. package/dist/cjs/types/base/snapshot.d.ts +6 -0
  8. package/dist/cjs/types/platforms/nest/__test__/server/database/core/entities/foo.entity.d.ts +2 -0
  9. package/dist/cjs/types/platforms/nest/__test__/server/entities/foos/foo.snapshot.d.ts +8 -0
  10. package/dist/cjs/types/platforms/nest/__test__/tests/versioning/entity-versioning-custom.test.d.ts +1 -0
  11. package/dist/cjs/types/platforms/nest/base/entitySnapshotService.d.ts +8 -0
  12. package/dist/cjs/types/platforms/nest/base/index.d.ts +1 -0
  13. package/dist/cjs/types/platforms/nest/decorators/index.d.ts +1 -0
  14. package/dist/cjs/types/platforms/nest/decorators/snapshot.d.ts +4 -0
  15. package/dist/cjs/types/platforms/nest/decorators/symbols.d.ts +1 -0
  16. package/dist/cjs/types/platforms/nest/ioc/registry/index.d.ts +3 -2
  17. package/dist/cjs/types/platforms/nest/processors/initializer/index.d.ts +1 -0
  18. package/dist/cjs/types/providers/services.d.ts +4 -1
  19. package/dist/cjs/types/symbols/ioc.d.ts +1 -0
  20. package/dist/esm/index.js +67 -6
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/types/abstractions/configuration.d.ts +2 -0
  23. package/dist/esm/types/abstractions/index.d.ts +1 -0
  24. package/dist/esm/types/abstractions/snapshot.d.ts +3 -0
  25. package/dist/esm/types/base/index.d.ts +1 -0
  26. package/dist/esm/types/base/snapshot.d.ts +6 -0
  27. package/dist/esm/types/platforms/nest/__test__/server/database/core/entities/foo.entity.d.ts +2 -0
  28. package/dist/esm/types/platforms/nest/__test__/server/entities/foos/foo.snapshot.d.ts +8 -0
  29. package/dist/esm/types/platforms/nest/__test__/tests/versioning/entity-versioning-custom.test.d.ts +1 -0
  30. package/dist/esm/types/platforms/nest/base/entitySnapshotService.d.ts +8 -0
  31. package/dist/esm/types/platforms/nest/base/index.d.ts +1 -0
  32. package/dist/esm/types/platforms/nest/decorators/index.d.ts +1 -0
  33. package/dist/esm/types/platforms/nest/decorators/snapshot.d.ts +4 -0
  34. package/dist/esm/types/platforms/nest/decorators/symbols.d.ts +1 -0
  35. package/dist/esm/types/platforms/nest/ioc/registry/index.d.ts +3 -2
  36. package/dist/esm/types/platforms/nest/processors/initializer/index.d.ts +1 -0
  37. package/dist/esm/types/providers/services.d.ts +4 -1
  38. package/dist/esm/types/symbols/ioc.d.ts +1 -0
  39. package/dist/index.d.ts +30 -2
  40. package/package.json +1 -1
package/dist/cjs/index.js CHANGED
@@ -294,6 +294,12 @@ class EntitySerializer {
294
294
  }
295
295
  }
296
296
 
297
+ class EntitySnapshotService {
298
+ constructor(entityName) {
299
+ this.entityName = entityName;
300
+ }
301
+ }
302
+
297
303
  class EntitiesCountAction {
298
304
  constructor(services) {
299
305
  this.services = services;
@@ -524,11 +530,13 @@ class EntityCreateCommand {
524
530
  }
525
531
  const contextService = this.services.resolveAuthenticationContextProvider();
526
532
  const context = await contextService?.getContext();
533
+ const snapshotService = this.services.resolveSnapshotService();
534
+ const snapshot = (await snapshotService?.getSnapshot(id)) ?? entity;
527
535
  await versioning.createVersion({
528
536
  operationType: exports.EntityVersionOperation.Create,
529
537
  entityId: id,
530
538
  entityType: this.services.getEntityName(),
531
- data: entity,
539
+ data: snapshot,
532
540
  modifiedByUserId: context?.userId,
533
541
  });
534
542
  }
@@ -546,8 +554,8 @@ class EntityDeleteCommand {
546
554
  throw new MissingEntityIdError();
547
555
  }
548
556
  await this.authorize(id);
549
- await this.services.resolveRepository().delete(id);
550
557
  await this.versionEntity(id);
558
+ await this.services.resolveRepository().delete(id);
551
559
  await this.services.resolveEventsManager().processEntityDeletedEvent(id);
552
560
  }
553
561
  async authorize(id) {
@@ -578,10 +586,13 @@ class EntityDeleteCommand {
578
586
  }
579
587
  const contextService = this.services.resolveAuthenticationContextProvider();
580
588
  const context = await contextService?.getContext();
589
+ const snapshotService = this.services.resolveSnapshotService();
590
+ const snapshot = await snapshotService?.getSnapshot(id);
581
591
  await versioning.createVersion({
582
592
  operationType: exports.EntityVersionOperation.Delete,
583
593
  entityId: id,
584
594
  entityType: this.services.getEntityName(),
595
+ data: snapshot,
585
596
  modifiedByUserId: context?.userId,
586
597
  });
587
598
  }
@@ -821,11 +832,13 @@ class EntityUpdateCommand {
821
832
  }
822
833
  const contextService = this.services.resolveAuthenticationContextProvider();
823
834
  const context = await contextService?.getContext();
835
+ const snapshotService = this.services.resolveSnapshotService();
836
+ const snapshot = (await snapshotService?.getSnapshot(id)) ?? entity;
824
837
  await versioning.createVersion({
825
838
  operationType: exports.EntityVersionOperation.Update,
826
839
  entityId: id,
827
840
  entityType: this.services.getEntityName(),
828
- data: entity,
841
+ data: snapshot,
829
842
  modifiedByUserId: context?.userId,
830
843
  });
831
844
  }
@@ -888,11 +901,13 @@ class EntityUpsertCommand {
888
901
  }
889
902
  const contextService = this.services.resolveAuthenticationContextProvider();
890
903
  const context = await contextService?.getContext();
904
+ const snapshotService = this.services.resolveSnapshotService();
905
+ const snapshot = (await snapshotService?.getSnapshot(id)) ?? entity;
891
906
  await versioning.createVersion({
892
907
  operationType: exports.EntityVersionOperation.Upsert,
893
908
  entityId: id,
894
909
  entityType: this.services.getEntityName(),
895
- data: entity,
910
+ data: snapshot,
896
911
  modifiedByUserId: context?.userId,
897
912
  });
898
913
  }
@@ -1094,6 +1109,7 @@ const EntityServices = {
1094
1109
  IEntityAdapter: "IEntityAdapter",
1095
1110
  IEntityConverter: "IEntityConverter",
1096
1111
  IEntitySerializer: "IEntitySerializer",
1112
+ IEntitySnapshotService: "IEntitySnapshotService",
1097
1113
  },
1098
1114
  Connectors: {
1099
1115
  IConnectorsConfiguration: "IConnectorsConfiguration",
@@ -1209,6 +1225,9 @@ class EntityServiceLocator {
1209
1225
  resolveSerializer() {
1210
1226
  return this.services.resolveSerializer(this.entityName);
1211
1227
  }
1228
+ resolveSnapshotService() {
1229
+ return this.services.resolveSnapshotService(this.entityName);
1230
+ }
1212
1231
  resolveAdapter() {
1213
1232
  return this.services.resolveAdapter(this.entityName);
1214
1233
  }
@@ -1479,6 +1498,14 @@ class EntitiesServiceLocator {
1479
1498
  resolveSerializer(entityName) {
1480
1499
  return this.provider.resolveEntityService(EntityServices.Converters.IEntitySerializer, entityName);
1481
1500
  }
1501
+ registerSnapshotService(entityName, instance) {
1502
+ this.provider.registerEntityService(EntityServices.Converters.IEntitySnapshotService, entityName, instance);
1503
+ }
1504
+ resolveSnapshotService(entityName) {
1505
+ return this.provider.resolveEntityService(EntityServices.Converters.IEntitySnapshotService, entityName, {
1506
+ optional: true,
1507
+ });
1508
+ }
1482
1509
  resolveAuthorizationMiddleware(entityName) {
1483
1510
  return this.provider.resolveEntityService(EntityServices.Authorization.IEntityAuthorizationMiddleware, entityName, {
1484
1511
  optional: true,
@@ -2209,6 +2236,10 @@ class EntityManagerServiceCollection {
2209
2236
  this.locator.registerSerializer(this.entityName, serializer);
2210
2237
  return this;
2211
2238
  }
2239
+ addSnapshotService(service) {
2240
+ this.locator.registerSnapshotService(this.entityName, service);
2241
+ return this;
2242
+ }
2212
2243
  addConverter(converter) {
2213
2244
  this.locator.registerConverter(this.entityName, converter);
2214
2245
  return this;
@@ -2288,6 +2319,16 @@ class NestEntitySerializer extends EntitySerializer {
2288
2319
  }
2289
2320
  }
2290
2321
 
2322
+ class NestEntitySnapshotService extends EntitySnapshotService {
2323
+ constructor(entityName, registry) {
2324
+ super(entityName);
2325
+ this.services = registry.resolveEntityServicesCollection(entityName);
2326
+ }
2327
+ get repository() {
2328
+ return this.services.resolveRepository();
2329
+ }
2330
+ }
2331
+
2291
2332
  const EntityManagerSymbols = {
2292
2333
  AppInitializer: Symbol.for("WP:APP_INITIALIZER"),
2293
2334
  EventsTracker: Symbol.for("WP:EVENTS_TRACKER"),
@@ -2299,6 +2340,7 @@ const EntityManagerSymbols = {
2299
2340
  EntityConnector: Symbol.for("WP:ENTITY_CONNECTOR"),
2300
2341
  EntityConverter: Symbol.for("WP:ENTITY_CONVERTER"),
2301
2342
  EntitySerializer: Symbol.for("WP:ENTITY_SERIALIZER"),
2343
+ EntitySnapshotService: Symbol.for("WP:ENTITY_SNAPSHOT_SERVICE"),
2302
2344
  EntityManager: Symbol.for("WP:ENTITY_MANAGER"),
2303
2345
  EntityQueryBuilder: Symbol.for("WP:ENTITY_QUERY_BUILDER"),
2304
2346
  EntitySeeder: Symbol.for("WP:ENTITY_SEEDER"),
@@ -2389,6 +2431,11 @@ const WpEntitySerializer = (entityName, props = {}) => common.applyDecorators(co
2389
2431
  ...props,
2390
2432
  }));
2391
2433
 
2434
+ const WpEntitySnapshotService = (entityName, props = {}) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.EntitySnapshotService, {
2435
+ entityName,
2436
+ ...props,
2437
+ }));
2438
+
2392
2439
  const WpEventsTracker = (props = {}) => common.applyDecorators(common.Injectable(), common.SetMetadata(EntityManagerSymbols.EventsTracker, {
2393
2440
  ...props,
2394
2441
  }));
@@ -2731,7 +2778,7 @@ exports.EntityManagerRegistry = class EntityManagerRegistry {
2731
2778
  .registerEventEmitter(eventEmitter);
2732
2779
  }
2733
2780
  }
2734
- async registerDiscoveredEntity(app, { adapter, entityName, entity, converter, queryBuilder, repository, authMiddleware, serializer, settings, }) {
2781
+ async registerDiscoveredEntity(app, { adapter, entityName, entity, converter, queryBuilder, repository, authMiddleware, serializer, snapshotService, settings, }) {
2735
2782
  if (!repository.discoveredClass.injectType) {
2736
2783
  throw new Error(`No inject type found for entity repository: ${entityName}`);
2737
2784
  }
@@ -2762,6 +2809,12 @@ exports.EntityManagerRegistry = class EntityManagerRegistry {
2762
2809
  if (adapterInstance) {
2763
2810
  registration.addAdapter(adapterInstance);
2764
2811
  }
2812
+ const snapshotServiceInstance = snapshotService?.discoveredClass.injectType
2813
+ ? (await app.resolve(snapshotService.discoveredClass.injectType))
2814
+ : undefined;
2815
+ if (snapshotServiceInstance) {
2816
+ registration.addSnapshotService(snapshotServiceInstance);
2817
+ }
2765
2818
  const authMiddlewareInstance = authMiddleware?.discoveredClass.injectType
2766
2819
  ? (await app.resolve(authMiddleware.discoveredClass.injectType))
2767
2820
  : undefined;
@@ -21397,12 +21450,14 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21397
21450
  const queryBuilders = await this.discoverQueryBuilders();
21398
21451
  const converters = await this.discoverConverters();
21399
21452
  const serializers = await this.discoverSerializers();
21453
+ const snapshotServices = await this.discoverSnapshotService();
21400
21454
  const adapters = await this.discoverAdapters();
21401
21455
  const auth = await this.discoverAuthMiddlewares();
21402
21456
  const repositoriesDict = backendCore.toDict(repositories, (q) => q.meta.entityName);
21403
21457
  const queryBuilderDict = backendCore.toDict(queryBuilders, (q) => q.meta.entityName);
21404
21458
  const converterDict = backendCore.toDict(converters, (c) => c.meta.entityName);
21405
21459
  const serializerDict = backendCore.toDict(serializers, (s) => s.meta.entityName);
21460
+ const snapshotServicesDict = backendCore.toDict(snapshotServices, (s) => s.meta.entityName);
21406
21461
  const adapterDict = backendCore.toDict(adapters, (a) => a.meta.entityName);
21407
21462
  const authDict = backendCore.toDict(auth, (a) => a.meta.entityName);
21408
21463
  const sortedEntities = lodash.exports.orderBy(entities, (x) => x.meta.name);
@@ -21427,6 +21482,7 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21427
21482
  const adapter = adapterDict[entityName];
21428
21483
  const authMiddleware = authDict[entityName];
21429
21484
  const serializer = serializerDict[entityName];
21485
+ const snapshotService = snapshotServicesDict[entityName];
21430
21486
  await this.registry.registerDiscoveredEntity(app, {
21431
21487
  entityName,
21432
21488
  entity,
@@ -21435,6 +21491,7 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21435
21491
  queryBuilder,
21436
21492
  converter,
21437
21493
  serializer,
21494
+ snapshotService,
21438
21495
  authMiddleware,
21439
21496
  settings: staticProviders.settings,
21440
21497
  });
@@ -21444,6 +21501,7 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21444
21501
  - Adapter: ${adapter?.discoveredClass.injectType?.name ?? ""}
21445
21502
  - Converter: ${converter?.discoveredClass.injectType?.name ?? ""}
21446
21503
  - Serializer: ${serializer?.discoveredClass.injectType?.name ?? ""}
21504
+ - SnapshotService: ${snapshotService?.discoveredClass.injectType?.name ?? ""}
21447
21505
  - Auth middleware: ${authMiddleware?.discoveredClass.injectType?.name ?? ""}
21448
21506
 
21449
21507
  `);
@@ -21586,6 +21644,9 @@ exports.EntityManagerInitializer = EntityManagerInitializer_1 = class EntityMana
21586
21644
  async discoverSerializers() {
21587
21645
  return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.EntitySerializer);
21588
21646
  }
21647
+ async discoverSnapshotService() {
21648
+ return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.EntitySnapshotService);
21649
+ }
21589
21650
  async discoverAdapters() {
21590
21651
  return await this.discover.providersWithMetaAtKey(EntityManagerSymbols.EntityAdapter);
21591
21652
  }
@@ -28128,6 +28189,7 @@ exports.EntityNotFoundException = EntityNotFoundException;
28128
28189
  exports.EntityOperationUnauthorizedException = EntityOperationUnauthorizedException;
28129
28190
  exports.EntitySeeder = EntitySeeder;
28130
28191
  exports.EntitySerializer = EntitySerializer;
28192
+ exports.EntitySnapshotService = EntitySnapshotService;
28131
28193
  exports.IEntityVersionsCursor = IEntityVersionsCursor;
28132
28194
  exports.InvalidCredentialsError = InvalidCredentialsError;
28133
28195
  exports.MemberOf = MemberOf;
@@ -28137,6 +28199,7 @@ exports.NestEntityActions = NestEntityActions;
28137
28199
  exports.NestEntityAuthorizationMiddleware = NestEntityAuthorizationMiddleware;
28138
28200
  exports.NestEntityManager = NestEntityManager;
28139
28201
  exports.NestEntitySerializer = NestEntitySerializer;
28202
+ exports.NestEntitySnapshotService = NestEntitySnapshotService;
28140
28203
  exports.NestPipelineTemplate = NestPipelineTemplate;
28141
28204
  exports.NestTypeOrmEntitySeeder = NestTypeOrmEntitySeeder;
28142
28205
  exports.NestTypeOrmQueryBuilder = NestTypeOrmQueryBuilder;
@@ -28168,6 +28231,7 @@ exports.WpEntityQueryBuilder = WpEntityQueryBuilder;
28168
28231
  exports.WpEntityRepository = WpEntityRepository;
28169
28232
  exports.WpEntitySeeder = WpEntitySeeder;
28170
28233
  exports.WpEntitySerializer = WpEntitySerializer;
28234
+ exports.WpEntitySnapshotService = WpEntitySnapshotService;
28171
28235
  exports.WpEntityVersioningProvider = WpEntityVersioningProvider;
28172
28236
  exports.WpEventsTracker = WpEventsTracker;
28173
28237
  exports.WpFileProvider = WpFileProvider;