@punks/backend-entity-manager 0.0.258 → 0.0.260

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 +268 -17
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/types/abstractions/index.d.ts +1 -0
  4. package/dist/cjs/types/abstractions/operations.d.ts +23 -0
  5. package/dist/cjs/types/platforms/nest/__test__/server/database/core/entities/appOperationLockItem.entity.d.ts +7 -0
  6. package/dist/cjs/types/platforms/nest/__test__/server/database/core/index.d.ts +4 -0
  7. package/dist/cjs/types/platforms/nest/__test__/server/database/core/repositories/appOperationLock.repository.d.ts +6 -0
  8. package/dist/cjs/types/platforms/nest/__test__/server/database/core/repositories.d.ts +2 -1
  9. package/dist/cjs/types/platforms/nest/extensions/authentication/decorators/guards.d.ts +2 -1
  10. package/dist/cjs/types/platforms/nest/extensions/authentication/decorators/index.d.ts +1 -0
  11. package/dist/cjs/types/platforms/nest/extensions/authentication/decorators/types.d.ts +3 -0
  12. package/dist/cjs/types/platforms/nest/extensions/authentication/guards/auth.d.ts +1 -1
  13. package/dist/cjs/types/platforms/nest/ioc/index.d.ts +1 -0
  14. package/dist/cjs/types/platforms/nest/ioc/tokens/builder.d.ts +1 -0
  15. package/dist/cjs/types/platforms/nest/ioc/tokens/index.d.ts +2 -0
  16. package/dist/cjs/types/platforms/nest/ioc/tokens/symbols.d.ts +4 -0
  17. package/dist/cjs/types/platforms/nest/services/index.d.ts +1 -0
  18. package/dist/cjs/types/platforms/nest/services/operations/index.d.ts +2 -0
  19. package/dist/cjs/types/platforms/nest/services/operations/operation-lock.repository.d.ts +16 -0
  20. package/dist/cjs/types/platforms/nest/services/operations/operation-lock.service.d.ts +9 -0
  21. package/dist/cjs/types/platforms/nest/services/operations/operation-lock.service.spec.d.ts +1 -0
  22. package/dist/cjs/types/platforms/nest/services/operations/types.d.ts +12 -0
  23. package/dist/cjs/types/platforms/nest/services/providers.d.ts +2 -1
  24. package/dist/esm/index.js +267 -19
  25. package/dist/esm/index.js.map +1 -1
  26. package/dist/esm/types/abstractions/index.d.ts +1 -0
  27. package/dist/esm/types/abstractions/operations.d.ts +23 -0
  28. package/dist/esm/types/platforms/nest/__test__/server/database/core/entities/appOperationLockItem.entity.d.ts +7 -0
  29. package/dist/esm/types/platforms/nest/__test__/server/database/core/index.d.ts +4 -0
  30. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories/appOperationLock.repository.d.ts +6 -0
  31. package/dist/esm/types/platforms/nest/__test__/server/database/core/repositories.d.ts +2 -1
  32. package/dist/esm/types/platforms/nest/extensions/authentication/decorators/guards.d.ts +2 -1
  33. package/dist/esm/types/platforms/nest/extensions/authentication/decorators/index.d.ts +1 -0
  34. package/dist/esm/types/platforms/nest/extensions/authentication/decorators/types.d.ts +3 -0
  35. package/dist/esm/types/platforms/nest/extensions/authentication/guards/auth.d.ts +1 -1
  36. package/dist/esm/types/platforms/nest/ioc/index.d.ts +1 -0
  37. package/dist/esm/types/platforms/nest/ioc/tokens/builder.d.ts +1 -0
  38. package/dist/esm/types/platforms/nest/ioc/tokens/index.d.ts +2 -0
  39. package/dist/esm/types/platforms/nest/ioc/tokens/symbols.d.ts +4 -0
  40. package/dist/esm/types/platforms/nest/services/index.d.ts +1 -0
  41. package/dist/esm/types/platforms/nest/services/operations/index.d.ts +2 -0
  42. package/dist/esm/types/platforms/nest/services/operations/operation-lock.repository.d.ts +16 -0
  43. package/dist/esm/types/platforms/nest/services/operations/operation-lock.service.d.ts +9 -0
  44. package/dist/esm/types/platforms/nest/services/operations/operation-lock.service.spec.d.ts +1 -0
  45. package/dist/esm/types/platforms/nest/services/operations/types.d.ts +12 -0
  46. package/dist/esm/types/platforms/nest/services/providers.d.ts +2 -1
  47. package/dist/index.d.ts +56 -3
  48. package/package.json +2 -2
package/dist/cjs/index.js CHANGED
@@ -126,6 +126,9 @@ class MissingEntityIdError extends EntityManagerException {
126
126
  }
127
127
  }
128
128
 
129
+ class LockNotFoundError extends Error {
130
+ }
131
+
129
132
  exports.ReplicationMode = void 0;
130
133
  (function (ReplicationMode) {
131
134
  ReplicationMode[ReplicationMode["Sync"] = 0] = "Sync";
@@ -3732,7 +3735,7 @@ const Authenticated = () => common.SetMetadata(AuthenticationGuardsSymbols.Authe
3732
3735
  const Permissions = (...permissions) => common.SetMetadata(AuthenticationGuardsSymbols.Permissions, permissions);
3733
3736
  const Roles = (...roles) => common.SetMetadata(AuthenticationGuardsSymbols.Roles, roles);
3734
3737
  const MemberOf = (...groups) => common.SetMetadata(AuthenticationGuardsSymbols.MemberOf, groups);
3735
- const ApiKeyAccess = () => common.SetMetadata(AuthenticationGuardsSymbols.ApiKey, true);
3738
+ const ApiKeyAccess = (options) => common.SetMetadata(AuthenticationGuardsSymbols.ApiKey, options ?? {});
3736
3739
  const buildRolesGuard = ({ mainRole, secondaryRoles, }, options) => Roles(mainRole.uid, ...(!options?.exact && secondaryRoles
3737
3740
  ? secondaryRoles.map((role) => role.uid)
3738
3741
  : []));
@@ -3804,6 +3807,10 @@ function __decorate(decorators, target, key, desc) {
3804
3807
  return c > 3 && r && Object.defineProperty(target, key, r), r;
3805
3808
  }
3806
3809
 
3810
+ function __param(paramIndex, decorator) {
3811
+ return function (target, key) { decorator(target, key, paramIndex); }
3812
+ }
3813
+
3807
3814
  function __metadata(metadataKey, metadataValue) {
3808
3815
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
3809
3816
  }
@@ -3828,18 +3835,20 @@ exports.AuthGuard = AuthGuard_1 = class AuthGuard {
3828
3835
  return true;
3829
3836
  }
3830
3837
  const auth = this.getCurrentAuth(context);
3831
- const isApiRoute = this.getIsApiRoute(context);
3832
- if (isApiRoute) {
3838
+ const apiRoute = this.getApiRoute(context);
3839
+ if (apiRoute) {
3833
3840
  if (auth?.apiKey && !auth.apiKey.disabled) {
3834
3841
  this.logger.debug(`Authorized:true -> api route with valid api key`, this.getContextInfo({
3835
3842
  context,
3836
3843
  }));
3837
3844
  return true;
3838
3845
  }
3839
- this.logger.debug(`Authorized:false -> api route without api key`, this.getContextInfo({
3840
- context,
3841
- }));
3842
- return false;
3846
+ if (apiRoute.strict) {
3847
+ this.logger.debug(`Authorized:false -> api route without api key`, this.getContextInfo({
3848
+ context,
3849
+ }));
3850
+ return false;
3851
+ }
3843
3852
  }
3844
3853
  const allowedRoles = this.getAllowedRoles(context);
3845
3854
  if (allowedRoles) {
@@ -3909,7 +3918,7 @@ exports.AuthGuard = AuthGuard_1 = class AuthGuard {
3909
3918
  getIsPublic(context) {
3910
3919
  return this.getMetadata(AuthenticationGuardsSymbols.Public, context);
3911
3920
  }
3912
- getIsApiRoute(context) {
3921
+ getApiRoute(context) {
3913
3922
  return this.getMetadata(AuthenticationGuardsSymbols.ApiKey, context);
3914
3923
  }
3915
3924
  getAllowedRoles(context) {
@@ -21542,6 +21551,15 @@ exports.CustomDiscoveryModule = __decorate([
21542
21551
  })
21543
21552
  ], exports.CustomDiscoveryModule);
21544
21553
 
21554
+ const LIB_DI_TOKEN_NAMESPACE = "WP";
21555
+ const buildProviderToken = (name) => `${LIB_DI_TOKEN_NAMESPACE}.PROVIDER.${name}`;
21556
+
21557
+ const EntityManagerProviderToken = {
21558
+ OperationsLockRepository: {},
21559
+ };
21560
+ const toSnakeUpperCase = (str) => lodash.exports.trimStart(str.replace(/([A-Z])/g, (match) => `_${match}`).toUpperCase(), "_");
21561
+ const getEntityManagerProviderToken = (name) => buildProviderToken(toSnakeUpperCase(name));
21562
+
21545
21563
  exports.EntityManagerService = class EntityManagerService {
21546
21564
  constructor(registry) {
21547
21565
  this.registry = registry;
@@ -21683,6 +21701,219 @@ exports.MediaLibraryService = __decorate([
21683
21701
  __metadata("design:paramtypes", [exports.EntityManagerRegistry])
21684
21702
  ], exports.MediaLibraryService);
21685
21703
 
21704
+ function _typeof(obj) {
21705
+ "@babel/helpers - typeof";
21706
+
21707
+ return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
21708
+ return typeof obj;
21709
+ } : function (obj) {
21710
+ return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
21711
+ }, _typeof(obj);
21712
+ }
21713
+
21714
+ function requiredArgs(required, args) {
21715
+ if (args.length < required) {
21716
+ throw new TypeError(required + ' argument' + (required > 1 ? 's' : '') + ' required, but only ' + args.length + ' present');
21717
+ }
21718
+ }
21719
+
21720
+ /**
21721
+ * @name toDate
21722
+ * @category Common Helpers
21723
+ * @summary Convert the given argument to an instance of Date.
21724
+ *
21725
+ * @description
21726
+ * Convert the given argument to an instance of Date.
21727
+ *
21728
+ * If the argument is an instance of Date, the function returns its clone.
21729
+ *
21730
+ * If the argument is a number, it is treated as a timestamp.
21731
+ *
21732
+ * If the argument is none of the above, the function returns Invalid Date.
21733
+ *
21734
+ * **Note**: *all* Date arguments passed to any *date-fns* function is processed by `toDate`.
21735
+ *
21736
+ * @param {Date|Number} argument - the value to convert
21737
+ * @returns {Date} the parsed date in the local time zone
21738
+ * @throws {TypeError} 1 argument required
21739
+ *
21740
+ * @example
21741
+ * // Clone the date:
21742
+ * const result = toDate(new Date(2014, 1, 11, 11, 30, 30))
21743
+ * //=> Tue Feb 11 2014 11:30:30
21744
+ *
21745
+ * @example
21746
+ * // Convert the timestamp to date:
21747
+ * const result = toDate(1392098430000)
21748
+ * //=> Tue Feb 11 2014 11:30:30
21749
+ */
21750
+ function toDate(argument) {
21751
+ requiredArgs(1, arguments);
21752
+ var argStr = Object.prototype.toString.call(argument);
21753
+
21754
+ // Clone the date
21755
+ if (argument instanceof Date || _typeof(argument) === 'object' && argStr === '[object Date]') {
21756
+ // Prevent the date to lose the milliseconds when passed to new Date() in IE10
21757
+ return new Date(argument.getTime());
21758
+ } else if (typeof argument === 'number' || argStr === '[object Number]') {
21759
+ return new Date(argument);
21760
+ } else {
21761
+ if ((typeof argument === 'string' || argStr === '[object String]') && typeof console !== 'undefined') {
21762
+ // eslint-disable-next-line no-console
21763
+ console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments");
21764
+ // eslint-disable-next-line no-console
21765
+ console.warn(new Error().stack);
21766
+ }
21767
+ return new Date(NaN);
21768
+ }
21769
+ }
21770
+
21771
+ /**
21772
+ * Days in 1 week.
21773
+ *
21774
+ * @name daysInWeek
21775
+ * @constant
21776
+ * @type {number}
21777
+ * @default
21778
+ */
21779
+
21780
+ /**
21781
+ * Milliseconds in 1 minute
21782
+ *
21783
+ * @name millisecondsInMinute
21784
+ * @constant
21785
+ * @type {number}
21786
+ * @default
21787
+ */
21788
+ var millisecondsInMinute = 60000;
21789
+
21790
+ /**
21791
+ * @name differenceInMilliseconds
21792
+ * @category Millisecond Helpers
21793
+ * @summary Get the number of milliseconds between the given dates.
21794
+ *
21795
+ * @description
21796
+ * Get the number of milliseconds between the given dates.
21797
+ *
21798
+ * @param {Date|Number} dateLeft - the later date
21799
+ * @param {Date|Number} dateRight - the earlier date
21800
+ * @returns {Number} the number of milliseconds
21801
+ * @throws {TypeError} 2 arguments required
21802
+ *
21803
+ * @example
21804
+ * // How many milliseconds are between
21805
+ * // 2 July 2014 12:30:20.600 and 2 July 2014 12:30:21.700?
21806
+ * const result = differenceInMilliseconds(
21807
+ * new Date(2014, 6, 2, 12, 30, 21, 700),
21808
+ * new Date(2014, 6, 2, 12, 30, 20, 600)
21809
+ * )
21810
+ * //=> 1100
21811
+ */
21812
+ function differenceInMilliseconds(dateLeft, dateRight) {
21813
+ requiredArgs(2, arguments);
21814
+ return toDate(dateLeft).getTime() - toDate(dateRight).getTime();
21815
+ }
21816
+
21817
+ var roundingMap = {
21818
+ ceil: Math.ceil,
21819
+ round: Math.round,
21820
+ floor: Math.floor,
21821
+ trunc: function trunc(value) {
21822
+ return value < 0 ? Math.ceil(value) : Math.floor(value);
21823
+ } // Math.trunc is not supported by IE
21824
+ };
21825
+
21826
+ var defaultRoundingMethod = 'trunc';
21827
+ function getRoundingMethod(method) {
21828
+ return method ? roundingMap[method] : roundingMap[defaultRoundingMethod];
21829
+ }
21830
+
21831
+ /**
21832
+ * @name differenceInMinutes
21833
+ * @category Minute Helpers
21834
+ * @summary Get the number of minutes between the given dates.
21835
+ *
21836
+ * @description
21837
+ * Get the signed number of full (rounded towards 0) minutes between the given dates.
21838
+ *
21839
+ * @param {Date|Number} dateLeft - the later date
21840
+ * @param {Date|Number} dateRight - the earlier date
21841
+ * @param {Object} [options] - an object with options.
21842
+ * @param {String} [options.roundingMethod='trunc'] - a rounding method (`ceil`, `floor`, `round` or `trunc`)
21843
+ * @returns {Number} the number of minutes
21844
+ * @throws {TypeError} 2 arguments required
21845
+ *
21846
+ * @example
21847
+ * // How many minutes are between 2 July 2014 12:07:59 and 2 July 2014 12:20:00?
21848
+ * const result = differenceInMinutes(
21849
+ * new Date(2014, 6, 2, 12, 20, 0),
21850
+ * new Date(2014, 6, 2, 12, 7, 59)
21851
+ * )
21852
+ * //=> 12
21853
+ *
21854
+ * @example
21855
+ * // How many minutes are between 10:01:59 and 10:00:00
21856
+ * const result = differenceInMinutes(
21857
+ * new Date(2000, 0, 1, 10, 0, 0),
21858
+ * new Date(2000, 0, 1, 10, 1, 59)
21859
+ * )
21860
+ * //=> -1
21861
+ */
21862
+ function differenceInMinutes(dateLeft, dateRight, options) {
21863
+ requiredArgs(2, arguments);
21864
+ var diff = differenceInMilliseconds(dateLeft, dateRight) / millisecondsInMinute;
21865
+ return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff);
21866
+ }
21867
+
21868
+ exports.OperationLockService = class OperationLockService {
21869
+ constructor(operations) {
21870
+ this.operations = operations;
21871
+ this.executeExclusive = async (input) => {
21872
+ const lock = await this.operations.acquire({
21873
+ lockUid: input.lockUid,
21874
+ requestedBy: input.requestedBy,
21875
+ });
21876
+ if (!lock.available &&
21877
+ input.lockTimeout &&
21878
+ this.isLockExpired(lock.lockItem, new Date(), input.lockTimeout)) {
21879
+ await this.operations.release({
21880
+ lockUid: input.lockUid,
21881
+ });
21882
+ return await this.executeExclusive(input);
21883
+ }
21884
+ if (!lock.available) {
21885
+ return {
21886
+ skipped: true,
21887
+ result: undefined,
21888
+ };
21889
+ }
21890
+ try {
21891
+ return {
21892
+ skipped: false,
21893
+ result: await this.executeOperation(input),
21894
+ };
21895
+ }
21896
+ finally {
21897
+ await this.operations.release({
21898
+ lockUid: input.lockUid,
21899
+ });
21900
+ }
21901
+ };
21902
+ this.executeOperation = async (input) => {
21903
+ return await input.operation();
21904
+ };
21905
+ this.isLockExpired = (item, refDate, timeoutMinutes) => {
21906
+ return differenceInMinutes(refDate, item.createdOn) > timeoutMinutes;
21907
+ };
21908
+ }
21909
+ };
21910
+ exports.OperationLockService = __decorate([
21911
+ common.Injectable(),
21912
+ __param(0, common.Optional()),
21913
+ __param(0, common.Inject(getEntityManagerProviderToken("OperationsLockRepository"))),
21914
+ __metadata("design:paramtypes", [Object])
21915
+ ], exports.OperationLockService);
21916
+
21686
21917
  exports.EmailService = class EmailService {
21687
21918
  constructor(registry) {
21688
21919
  this.registry = registry;
@@ -22646,6 +22877,7 @@ const Services$1 = [
22646
22877
  exports.MediaLibraryService,
22647
22878
  exports.SecretsService,
22648
22879
  exports.TrackingService,
22880
+ exports.OperationLockService,
22649
22881
  ];
22650
22882
 
22651
22883
  const IoC = [exports.EntityManagerRegistry];
@@ -23220,10 +23452,32 @@ const getIoCContext = () => {
23220
23452
  return _context;
23221
23453
  };
23222
23454
 
23455
+ const ModuleData$7 = {
23456
+ imports: [exports.CustomDiscoveryModule, eventEmitter.EventEmitterModule],
23457
+ providers: [
23458
+ ...IoC,
23459
+ ...Providers,
23460
+ ...Processors,
23461
+ ...Services$1,
23462
+ ...PipelineProviders,
23463
+ ],
23464
+ exports: [exports.EntityManagerRegistry, ...Services$1],
23465
+ };
23223
23466
  exports.EntityManagerModule = class EntityManagerModule {
23224
23467
  constructor(registry) {
23225
23468
  this.registry = registry;
23226
23469
  }
23470
+ // static forRoot(input: {
23471
+ // imports?: ModuleMetadata["imports"]
23472
+ // providers?: ModuleMetadata["providers"]
23473
+ // }): DynamicModule {
23474
+ // return {
23475
+ // module: EntityManagerModule,
23476
+ // imports: ModuleData.imports,
23477
+ // providers: [...ModuleData.providers, ...(input.providers ?? [])],
23478
+ // exports: ModuleData.exports,
23479
+ // }
23480
+ // }
23227
23481
  onModuleInit() {
23228
23482
  initializeIoCContext({
23229
23483
  registry: this.registry,
@@ -23232,15 +23486,9 @@ exports.EntityManagerModule = class EntityManagerModule {
23232
23486
  };
23233
23487
  exports.EntityManagerModule = __decorate([
23234
23488
  common.Module({
23235
- imports: [exports.CustomDiscoveryModule, eventEmitter.EventEmitterModule],
23236
- providers: [
23237
- ...IoC,
23238
- ...Providers,
23239
- ...Processors,
23240
- ...Services$1,
23241
- ...PipelineProviders,
23242
- ],
23243
- exports: [exports.EntityManagerRegistry, ...Services$1],
23489
+ imports: ModuleData$7.imports,
23490
+ providers: ModuleData$7.providers,
23491
+ exports: ModuleData$7.exports,
23244
23492
  }),
23245
23493
  __metadata("design:paramtypes", [exports.EntityManagerRegistry])
23246
23494
  ], exports.EntityManagerModule);
@@ -32696,6 +32944,7 @@ exports.AwsSesEmailTemplate = AwsSesEmailTemplate;
32696
32944
  exports.CurrentUser = CurrentUser;
32697
32945
  exports.EntityManagerConfigurationError = EntityManagerConfigurationError;
32698
32946
  exports.EntityManagerException = EntityManagerException;
32947
+ exports.EntityManagerProviderToken = EntityManagerProviderToken;
32699
32948
  exports.EntityManagerSymbols = EntityManagerSymbols;
32700
32949
  exports.EntityManagerUnauthorizedException = EntityManagerUnauthorizedException;
32701
32950
  exports.EntityNotFoundException = EntityNotFoundException;
@@ -32705,6 +32954,7 @@ exports.EntitySerializer = EntitySerializer;
32705
32954
  exports.EntitySnapshotService = EntitySnapshotService;
32706
32955
  exports.IEntityVersionsCursor = IEntityVersionsCursor;
32707
32956
  exports.InvalidCredentialsError = InvalidCredentialsError;
32957
+ exports.LockNotFoundError = LockNotFoundError;
32708
32958
  exports.MemberOf = MemberOf;
32709
32959
  exports.MissingEntityIdError = MissingEntityIdError;
32710
32960
  exports.MultipleEntitiesFoundException = MultipleEntitiesFoundException;
@@ -32767,6 +33017,7 @@ exports.WpSendgridEmailTemplate = WpSendgridEmailTemplate;
32767
33017
  exports.WpUserRolesService = WpUserRolesService;
32768
33018
  exports.WpUserService = WpUserService;
32769
33019
  exports.buildPermissionsGuard = buildPermissionsGuard;
33020
+ exports.buildProviderToken = buildProviderToken;
32770
33021
  exports.buildRolesGuard = buildRolesGuard;
32771
33022
  exports.createContainer = createContainer;
32772
33023
  exports.createExpressFileResponse = createExpressFileResponse;