@mondart/nestjs-common-module-iam 2.0.0 → 3.1.0

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 (76) hide show
  1. package/dist/constants/iam-decorator-key.const.d.ts +7 -4
  2. package/dist/constants/iam-decorator-key.const.d.ts.map +1 -1
  3. package/dist/constants/iam-decorator-key.const.js +8 -5
  4. package/dist/constants/iam-decorator-key.const.js.map +1 -1
  5. package/dist/decorators/allow-iam.decorator.d.ts +3 -0
  6. package/dist/decorators/allow-iam.decorator.d.ts.map +1 -0
  7. package/dist/decorators/allow-iam.decorator.js +8 -0
  8. package/dist/decorators/allow-iam.decorator.js.map +1 -0
  9. package/dist/decorators/iam-entity-access.decorator.d.ts +4 -0
  10. package/dist/decorators/iam-entity-access.decorator.d.ts.map +1 -0
  11. package/dist/decorators/iam-entity-access.decorator.js +10 -0
  12. package/dist/decorators/iam-entity-access.decorator.js.map +1 -0
  13. package/dist/decorators/public-iam.decorators.d.ts +2 -0
  14. package/dist/decorators/public-iam.decorators.d.ts.map +1 -0
  15. package/dist/decorators/public-iam.decorators.js +8 -0
  16. package/dist/decorators/public-iam.decorators.js.map +1 -0
  17. package/dist/guards/iam-context.guard.d.ts +3 -4
  18. package/dist/guards/iam-context.guard.d.ts.map +1 -1
  19. package/dist/guards/iam-context.guard.js +25 -86
  20. package/dist/guards/iam-context.guard.js.map +1 -1
  21. package/dist/helpers/user-owner.helper.d.ts +12 -0
  22. package/dist/helpers/user-owner.helper.d.ts.map +1 -0
  23. package/dist/helpers/user-owner.helper.js +55 -0
  24. package/dist/helpers/user-owner.helper.js.map +1 -0
  25. package/dist/iam-context.module.d.ts +3 -0
  26. package/dist/iam-context.module.d.ts.map +1 -1
  27. package/dist/iam-context.module.js +45 -11
  28. package/dist/iam-context.module.js.map +1 -1
  29. package/dist/index.d.ts +10 -5
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +10 -5
  32. package/dist/index.js.map +1 -1
  33. package/dist/interfaces/iam-context-options.interface.d.ts +27 -0
  34. package/dist/interfaces/iam-context-options.interface.d.ts.map +1 -0
  35. package/dist/interfaces/iam-context-options.interface.js +18 -0
  36. package/dist/interfaces/iam-context-options.interface.js.map +1 -0
  37. package/dist/interfaces/iam-entity-access.interface.d.ts +39 -0
  38. package/dist/interfaces/iam-entity-access.interface.d.ts.map +1 -0
  39. package/dist/interfaces/iam-entity-access.interface.js +3 -0
  40. package/dist/interfaces/iam-entity-access.interface.js.map +1 -0
  41. package/dist/pipes/iam-find-one-query-scope.pipe.d.ts +10 -0
  42. package/dist/pipes/iam-find-one-query-scope.pipe.d.ts.map +1 -0
  43. package/dist/pipes/{iam-paginate-query.pipe.js → iam-find-one-query-scope.pipe.js} +22 -24
  44. package/dist/pipes/iam-find-one-query-scope.pipe.js.map +1 -0
  45. package/dist/pipes/iam-paginate-query-scope.pipe.d.ts +11 -0
  46. package/dist/pipes/iam-paginate-query-scope.pipe.d.ts.map +1 -0
  47. package/dist/pipes/iam-paginate-query-scope.pipe.js +48 -0
  48. package/dist/pipes/iam-paginate-query-scope.pipe.js.map +1 -0
  49. package/dist/services/iam-entity-access.service.d.ts +22 -0
  50. package/dist/services/iam-entity-access.service.d.ts.map +1 -0
  51. package/dist/services/iam-entity-access.service.js +250 -0
  52. package/dist/services/iam-entity-access.service.js.map +1 -0
  53. package/dist/types/iam-entity-access.type.d.ts +19 -0
  54. package/dist/types/iam-entity-access.type.d.ts.map +1 -0
  55. package/dist/types/iam-entity-access.type.js +4 -0
  56. package/dist/types/iam-entity-access.type.js.map +1 -0
  57. package/package.json +16 -3
  58. package/dist/decorators/get-owner-id.decorator.d.ts +0 -2
  59. package/dist/decorators/get-owner-id.decorator.d.ts.map +0 -1
  60. package/dist/decorators/get-owner-id.decorator.js +0 -13
  61. package/dist/decorators/get-owner-id.decorator.js.map +0 -1
  62. package/dist/decorators/iam-public.decorator.d.ts +0 -2
  63. package/dist/decorators/iam-public.decorator.d.ts.map +0 -1
  64. package/dist/decorators/iam-public.decorator.js +0 -8
  65. package/dist/decorators/iam-public.decorator.js.map +0 -1
  66. package/dist/decorators/owns-entity.decorator.d.ts +0 -14
  67. package/dist/decorators/owns-entity.decorator.d.ts.map +0 -1
  68. package/dist/decorators/owns-entity.decorator.js +0 -8
  69. package/dist/decorators/owns-entity.decorator.js.map +0 -1
  70. package/dist/decorators/set-iam-route-user-type.decorator.d.ts +0 -3
  71. package/dist/decorators/set-iam-route-user-type.decorator.d.ts.map +0 -1
  72. package/dist/decorators/set-iam-route-user-type.decorator.js +0 -8
  73. package/dist/decorators/set-iam-route-user-type.decorator.js.map +0 -1
  74. package/dist/pipes/iam-paginate-query.pipe.d.ts +0 -8
  75. package/dist/pipes/iam-paginate-query.pipe.d.ts.map +0 -1
  76. package/dist/pipes/iam-paginate-query.pipe.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ import { IamUserTypeEnum } from '../enums/iam-user-type.enum';
2
+ import { AccessValueCast, AccessValueSource, EntityAccessBranch } from '../types/iam-entity-access.type';
3
+ import { EntityTarget } from 'typeorm';
4
+ export interface EntityFieldMatch<T = any> {
5
+ field: keyof T & string;
6
+ valueFrom: AccessValueSource;
7
+ cast?: AccessValueCast;
8
+ }
9
+ export interface RoleEntityAccess<T = any> {
10
+ anyOf: EntityAccessBranch<T>[];
11
+ }
12
+ export interface EntityAccessByRole<T = any> {
13
+ agent?: {
14
+ bypass?: boolean;
15
+ anyOf?: EntityAccessBranch<T>[];
16
+ };
17
+ user?: RoleEntityAccess<T>;
18
+ guest?: RoleEntityAccess<T>;
19
+ }
20
+ export interface RequireIamEntityAccessOptions<T = any> {
21
+ entity: EntityTarget<T>;
22
+ lookup: {
23
+ field: keyof T & string;
24
+ valueFrom: AccessValueSource;
25
+ };
26
+ access?: EntityAccessByRole<T>;
27
+ resourceName?: string;
28
+ }
29
+ export interface ApplyIamEntityScopeOptions<T = any> {
30
+ entity?: EntityTarget<T>;
31
+ access?: EntityAccessByRole<T>;
32
+ withDeleted?: boolean;
33
+ }
34
+ export interface IamAccessValueContext {
35
+ req: any;
36
+ iamContext: any;
37
+ userType: IamUserTypeEnum;
38
+ }
39
+ //# sourceMappingURL=iam-entity-access.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/iam-entity-access.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IACxB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,GAAG;IACzC,KAAK,CAAC,EAAE;QACN,MAAM,CAAC,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;KACjC,CAAC;IAEF,IAAI,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAE3B,KAAK,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,6BAA6B,CAAC,CAAC,GAAG,GAAG;IACpD,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAExB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;QACxB,SAAS,EAAE,iBAAiB,CAAC;KAC9B,CAAC;IAMF,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAE/B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,0BAA0B,CAAC,CAAC,GAAG,GAAG;IAIjD,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAMzB,MAAM,CAAC,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC;IAE/B,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB;IACpC,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,GAAG,CAAC;IAChB,QAAQ,EAAE,eAAe,CAAC;CAC3B"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=iam-entity-access.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.interface.js","sourceRoot":"","sources":["../../src/interfaces/iam-entity-access.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { PipeTransform } from '@nestjs/common';
2
+ import { IamEntityAccessService } from '../services/iam-entity-access.service';
3
+ import { IamScopedFindOneQuery } from '../types/iam-entity-access.type';
4
+ export declare class IamFindOneQueryScopePipe<T = any> implements PipeTransform<Record<string, any>, IamScopedFindOneQuery<T>> {
5
+ private readonly request;
6
+ private readonly iamEntityAccessService;
7
+ constructor(request: any, iamEntityAccessService: IamEntityAccessService);
8
+ transform(value: Record<string, any>): IamScopedFindOneQuery<T>;
9
+ }
10
+ //# sourceMappingURL=iam-find-one-query-scope.pipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-find-one-query-scope.pipe.d.ts","sourceRoot":"","sources":["../../src/pipes/iam-find-one-query-scope.pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAS,MAAM,gBAAgB,CAAC;AAI1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAQxE,qBACa,wBAAwB,CAAC,CAAC,GAAG,GAAG,CAAE,YAAW,aAAa,CACrE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnB,qBAAqB,CAAC,CAAC,CAAC,CACzB;IAGG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBADtB,OAAO,EAAE,GAAG,EACZ,sBAAsB,EAAE,sBAAsB;IAGjE,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC;CA4BhE"}
@@ -12,36 +12,34 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
12
  return function (target, key) { decorator(target, key, paramIndex); }
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.IamPaginateQueryPipe = void 0;
15
+ exports.IamFindOneQueryScopePipe = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const core_1 = require("@nestjs/core");
18
18
  const nestjs_common_module_core_1 = require("@mondart/nestjs-common-module-core");
19
- let IamPaginateQueryPipe = class IamPaginateQueryPipe {
20
- constructor(request) {
19
+ const iam_entity_access_service_1 = require("../services/iam-entity-access.service");
20
+ const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
21
+ let IamFindOneQueryScopePipe = class IamFindOneQueryScopePipe {
22
+ constructor(request, iamEntityAccessService) {
21
23
  this.request = request;
24
+ this.iamEntityAccessService = iamEntityAccessService;
22
25
  }
23
- transform(value, metadata) {
24
- const iamContext = (0, nestjs_common_module_core_1.getIamContext)(this.request);
25
- if (!iamContext?.isAgent && iamContext?.user) {
26
- const { storeId, contactId } = iamContext.user;
27
- value.filter = {
28
- contactId: `$eq:${contactId}`,
29
- storeId: `$eq:${storeId}`,
30
- };
31
- }
32
- if (!iamContext?.isAgent && !iamContext?.user) {
33
- value.filter = {
34
- contactId: `$null`,
35
- };
26
+ transform(value) {
27
+ const query = (value ?? {});
28
+ const scopeOptions = this.request[iam_decorator_key_const_1.IAM_REQUEST_ENTITY_SCOPE_OPTIONS_KEY];
29
+ if (!scopeOptions) {
30
+ return query;
36
31
  }
37
- value.withDeleted = true;
38
- return value;
32
+ const iamContext = (0, nestjs_common_module_core_1.getIamContext)(this.request);
33
+ const currentUserType = this.request[iam_decorator_key_const_1.IAM_REQUEST_USER_TYPE_KEY];
34
+ const scopeWhere = this.iamEntityAccessService.buildScopeWhere(scopeOptions, this.request, iamContext, currentUserType);
35
+ query[iam_decorator_key_const_1.IAM_QUERY_SCOPE_WHERE_KEY] = scopeWhere;
36
+ return query;
39
37
  }
40
38
  };
41
- exports.IamPaginateQueryPipe = IamPaginateQueryPipe;
42
- exports.IamPaginateQueryPipe = IamPaginateQueryPipe = __decorate([
43
- (0, common_1.Injectable)(),
39
+ exports.IamFindOneQueryScopePipe = IamFindOneQueryScopePipe;
40
+ exports.IamFindOneQueryScopePipe = IamFindOneQueryScopePipe = __decorate([
41
+ (0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
44
42
  __param(0, (0, common_1.Inject)(core_1.REQUEST)),
45
- __metadata("design:paramtypes", [Request])
46
- ], IamPaginateQueryPipe);
47
- //# sourceMappingURL=iam-paginate-query.pipe.js.map
43
+ __metadata("design:paramtypes", [Object, iam_entity_access_service_1.IamEntityAccessService])
44
+ ], IamFindOneQueryScopePipe);
45
+ //# sourceMappingURL=iam-find-one-query-scope.pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-find-one-query-scope.pipe.js","sourceRoot":"","sources":["../../src/pipes/iam-find-one-query-scope.pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA0E;AAC1E,uCAAuC;AACvC,kFAAmE;AAEnE,qFAA+E;AAG/E,kFAI8C;AAIvC,IAAM,wBAAwB,GAA9B,MAAM,wBAAwB;IAInC,YAEmB,OAAY,EACZ,sBAA8C;QAD9C,YAAO,GAAP,OAAO,CAAK;QACZ,2BAAsB,GAAtB,sBAAsB,CAAwB;IAC9D,CAAC;IAEJ,SAAS,CAAC,KAA0B;QAClC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,EAAE,CAA6B,CAAC;QAExD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,8DAAoC,CAEzD,CAAC;QAEd,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,yCAAa,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAClC,mDAAyB,CACP,CAAC;QAErB,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB,CAAC,eAAe,CAC5D,YAAY,EACZ,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,eAAe,CAChB,CAAC;QAEF,KAAK,CAAC,mDAAyB,CAAC,GAAG,UAAU,CAAC;QAE9C,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAtCY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;IAMhC,WAAA,IAAA,eAAM,EAAC,cAAO,CAAC,CAAA;6CAEyB,kDAAsB;GAPtD,wBAAwB,CAsCpC"}
@@ -0,0 +1,11 @@
1
+ import { PipeTransform } from '@nestjs/common';
2
+ import { PaginateQuery } from 'nestjs-paginate';
3
+ import { IamEntityAccessService } from '../services/iam-entity-access.service';
4
+ import { IamScopedPaginateQuery } from '../types/iam-entity-access.type';
5
+ export declare class IamPaginateQueryScopePipe<T = any> implements PipeTransform<PaginateQuery, IamScopedPaginateQuery<T>> {
6
+ private readonly request;
7
+ private readonly iamEntityAccessService;
8
+ constructor(request: any, iamEntityAccessService: IamEntityAccessService);
9
+ transform(value: PaginateQuery): IamScopedPaginateQuery<T>;
10
+ }
11
+ //# sourceMappingURL=iam-paginate-query-scope.pipe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-paginate-query-scope.pipe.d.ts","sourceRoot":"","sources":["../../src/pipes/iam-paginate-query-scope.pipe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,aAAa,EAAS,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAQzE,qBACa,yBAAyB,CAAC,CAAC,GAAG,GAAG,CAAE,YAAW,aAAa,CACtE,aAAa,EACb,sBAAsB,CAAC,CAAC,CAAC,CAC1B;IAGG,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,sBAAsB;gBADtB,OAAO,EAAE,GAAG,EACZ,sBAAsB,EAAE,sBAAsB;IAGjE,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,sBAAsB,CAAC,CAAC,CAAC;CA+B3D"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.IamPaginateQueryScopePipe = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const core_1 = require("@nestjs/core");
18
+ const nestjs_common_module_core_1 = require("@mondart/nestjs-common-module-core");
19
+ const iam_entity_access_service_1 = require("../services/iam-entity-access.service");
20
+ const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
21
+ let IamPaginateQueryScopePipe = class IamPaginateQueryScopePipe {
22
+ constructor(request, iamEntityAccessService) {
23
+ this.request = request;
24
+ this.iamEntityAccessService = iamEntityAccessService;
25
+ }
26
+ transform(value) {
27
+ const query = value;
28
+ const scopeOptions = this.request[iam_decorator_key_const_1.IAM_REQUEST_ENTITY_SCOPE_OPTIONS_KEY];
29
+ if (!scopeOptions) {
30
+ return query;
31
+ }
32
+ const iamContext = (0, nestjs_common_module_core_1.getIamContext)(this.request);
33
+ const currentUserType = this.request[iam_decorator_key_const_1.IAM_REQUEST_USER_TYPE_KEY];
34
+ query[iam_decorator_key_const_1.IAM_QUERY_SCOPE_WHERE_KEY] =
35
+ this.iamEntityAccessService.buildScopeWhere(scopeOptions, this.request, iamContext, currentUserType);
36
+ if (typeof scopeOptions.withDeleted === 'boolean') {
37
+ query.withDeleted = scopeOptions.withDeleted;
38
+ }
39
+ return query;
40
+ }
41
+ };
42
+ exports.IamPaginateQueryScopePipe = IamPaginateQueryScopePipe;
43
+ exports.IamPaginateQueryScopePipe = IamPaginateQueryScopePipe = __decorate([
44
+ (0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
45
+ __param(0, (0, common_1.Inject)(core_1.REQUEST)),
46
+ __metadata("design:paramtypes", [Object, iam_entity_access_service_1.IamEntityAccessService])
47
+ ], IamPaginateQueryScopePipe);
48
+ //# sourceMappingURL=iam-paginate-query-scope.pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-paginate-query-scope.pipe.js","sourceRoot":"","sources":["../../src/pipes/iam-paginate-query-scope.pipe.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAA0E;AAC1E,uCAAuC;AAEvC,kFAAmE;AAEnE,qFAA+E;AAG/E,kFAI8C;AAIvC,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IAIpC,YAEmB,OAAY,EACZ,sBAA8C;QAD9C,YAAO,GAAP,OAAO,CAAK;QACZ,2BAAsB,GAAtB,sBAAsB,CAAwB;IAC9D,CAAC;IAEJ,SAAS,CAAC,KAAoB;QAC5B,MAAM,KAAK,GAAG,KAAkC,CAAC;QAEjD,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,8DAAoC,CAEzD,CAAC;QAEd,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,IAAA,yCAAa,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAClC,mDAAyB,CACP,CAAC;QAErB,KAAK,CAAC,mDAAyB,CAAC;YAC9B,IAAI,CAAC,sBAAsB,CAAC,eAAe,CACzC,YAAY,EACZ,IAAI,CAAC,OAAO,EACZ,UAAU,EACV,eAAe,CAChB,CAAC;QAEJ,IAAI,OAAO,YAAY,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAClD,KAAK,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AAzCY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,EAAC,EAAE,KAAK,EAAE,cAAK,CAAC,OAAO,EAAE,CAAC;IAMhC,WAAA,IAAA,eAAM,EAAC,cAAO,CAAC,CAAA;6CAEyB,kDAAsB;GAPtD,yBAAyB,CAyCrC"}
@@ -0,0 +1,22 @@
1
+ import { DataSource, FindOptionsWhere } from 'typeorm';
2
+ import { IamUserTypeEnum } from '../enums/iam-user-type.enum';
3
+ import { ApplyIamEntityScopeOptions, RequireIamEntityAccessOptions } from '../interfaces/iam-entity-access.interface';
4
+ export declare class IamEntityAccessService {
5
+ private readonly dataSource;
6
+ constructor(dataSource: DataSource);
7
+ resolveUserType(iamContext: any, allowedUserTypes: IamUserTypeEnum[]): IamUserTypeEnum;
8
+ hasEntityAccess<T>(options: RequireIamEntityAccessOptions<T>, req: any, iamContext: any, userType: IamUserTypeEnum): Promise<boolean>;
9
+ buildScopeWhere<T>(options: ApplyIamEntityScopeOptions<T>, req: any, iamContext?: any, userType?: IamUserTypeEnum): FindOptionsWhere<T> | FindOptionsWhere<T>[] | undefined;
10
+ private buildScopedWhere;
11
+ private buildWhereFromBranches;
12
+ private buildAllMatchWhere;
13
+ private buildNullFieldsWhere;
14
+ private buildBaseWhere;
15
+ private normalizeWhereResult;
16
+ private getValueFromSource;
17
+ private getValueByPath;
18
+ private castValue;
19
+ private normalizeEntityId;
20
+ private hasValue;
21
+ }
22
+ //# sourceMappingURL=iam-entity-access.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.service.d.ts","sourceRoot":"","sources":["../../src/services/iam-entity-access.service.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAU,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,0BAA0B,EAE1B,6BAA6B,EAC9B,MAAM,2CAA2C,CAAC;AAOnD,qBACa,sBAAsB;IAG/B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAAV,UAAU,EAAE,UAAU;IAGzC,eAAe,CACb,UAAU,EAAE,GAAG,EACf,gBAAgB,EAAE,eAAe,EAAE,GAClC,eAAe;IA0BZ,eAAe,CAAC,CAAC,EACrB,OAAO,EAAE,6BAA6B,CAAC,CAAC,CAAC,EACzC,GAAG,EAAE,GAAG,EACR,UAAU,EAAE,GAAG,EACf,QAAQ,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IAoDnB,eAAe,CAAC,CAAC,EACf,OAAO,EAAE,0BAA0B,CAAC,CAAC,CAAC,EACtC,GAAG,EAAE,GAAG,EACR,UAAU,GAAE,GAAwB,EACpC,QAAQ,CAAC,EAAE,eAAe,GACzB,gBAAgB,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS;IAQ1D,OAAO,CAAC,gBAAgB;IAmExB,OAAO,CAAC,sBAAsB;IAyC9B,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,SAAS;IAiCjB,OAAO,CAAC,iBAAiB;IAgBzB,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.IamEntityAccessService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const nestjs_common_module_core_1 = require("@mondart/nestjs-common-module-core");
18
+ const typeorm_1 = require("@nestjs/typeorm");
19
+ const typeorm_2 = require("typeorm");
20
+ const iam_user_type_enum_1 = require("../enums/iam-user-type.enum");
21
+ let IamEntityAccessService = class IamEntityAccessService {
22
+ constructor(dataSource) {
23
+ this.dataSource = dataSource;
24
+ }
25
+ resolveUserType(iamContext, allowedUserTypes) {
26
+ if (this.hasValue(iamContext?.agentId) || iamContext?.isAgent) {
27
+ return iam_user_type_enum_1.IamUserTypeEnum.AGENT;
28
+ }
29
+ if (this.hasValue(iamContext?.userId) || iamContext?.user) {
30
+ return iam_user_type_enum_1.IamUserTypeEnum.USER;
31
+ }
32
+ if (this.hasValue(iamContext?.guestId) ||
33
+ this.hasValue(iamContext?.guest?.id)) {
34
+ return iam_user_type_enum_1.IamUserTypeEnum.GUEST;
35
+ }
36
+ if (allowedUserTypes.includes(iam_user_type_enum_1.IamUserTypeEnum.GUEST)) {
37
+ return iam_user_type_enum_1.IamUserTypeEnum.GUEST;
38
+ }
39
+ throw new common_1.UnauthorizedException();
40
+ }
41
+ async hasEntityAccess(options, req, iamContext, userType) {
42
+ const rawEntityId = this.getValueFromSource(options.lookup.valueFrom, {
43
+ req,
44
+ iamContext,
45
+ userType,
46
+ });
47
+ const entityId = this.normalizeEntityId(rawEntityId);
48
+ if (!this.hasValue(entityId)) {
49
+ throw new common_1.BadRequestException('Missing entity identifier');
50
+ }
51
+ const repo = this.dataSource.getRepository(options.entity);
52
+ const baseWhere = {
53
+ [options.lookup.field]: entityId,
54
+ };
55
+ const exists = await repo.exists({
56
+ where: baseWhere,
57
+ });
58
+ if (!exists) {
59
+ throw new common_1.NotFoundException(nestjs_common_module_core_1.MessageFormatter.replace(nestjs_common_module_core_1.SharedMessages.RESOURCE_NOT_FOUND, options.resourceName ?? 'Resource'));
60
+ }
61
+ const scopedWhere = this.buildScopedWhere(options, req, iamContext, userType, {
62
+ lookupField: options.lookup.field,
63
+ entityId,
64
+ });
65
+ if (scopedWhere === undefined) {
66
+ return true;
67
+ }
68
+ return repo.exists({
69
+ where: scopedWhere,
70
+ });
71
+ }
72
+ buildScopeWhere(options, req, iamContext = (0, nestjs_common_module_core_1.getIamContext)(req), userType) {
73
+ const resolvedUserType = userType ??
74
+ this.resolveUserType(iamContext, Object.values(iam_user_type_enum_1.IamUserTypeEnum));
75
+ return this.buildScopedWhere(options, req, iamContext, resolvedUserType);
76
+ }
77
+ buildScopedWhere(options, req, iamContext, userType, lookup) {
78
+ if (userType === iam_user_type_enum_1.IamUserTypeEnum.AGENT) {
79
+ const agentAccess = options.access?.agent;
80
+ if (!agentAccess || agentAccess.bypass !== false) {
81
+ return undefined;
82
+ }
83
+ const where = this.buildWhereFromBranches({
84
+ branches: agentAccess.anyOf ?? [],
85
+ req,
86
+ iamContext,
87
+ userType,
88
+ lookup,
89
+ });
90
+ if (!where.length) {
91
+ throw new common_1.ForbiddenException();
92
+ }
93
+ return this.normalizeWhereResult(where);
94
+ }
95
+ if (userType === iam_user_type_enum_1.IamUserTypeEnum.USER) {
96
+ const where = this.buildWhereFromBranches({
97
+ branches: options.access?.user?.anyOf ?? [],
98
+ req,
99
+ iamContext,
100
+ userType,
101
+ lookup,
102
+ });
103
+ if (!where.length) {
104
+ throw new common_1.ForbiddenException();
105
+ }
106
+ return this.normalizeWhereResult(where);
107
+ }
108
+ if (userType === iam_user_type_enum_1.IamUserTypeEnum.GUEST) {
109
+ const where = this.buildWhereFromBranches({
110
+ branches: options.access?.guest?.anyOf ?? [],
111
+ req,
112
+ iamContext,
113
+ userType,
114
+ lookup,
115
+ });
116
+ if (!where.length) {
117
+ throw new common_1.ForbiddenException();
118
+ }
119
+ return this.normalizeWhereResult(where);
120
+ }
121
+ throw new common_1.ForbiddenException();
122
+ }
123
+ buildWhereFromBranches(params) {
124
+ const { branches, req, iamContext, userType, lookup } = params;
125
+ return branches.reduce((items, branch) => {
126
+ if ('nullFields' in branch) {
127
+ items.push(this.buildNullFieldsWhere(branch.nullFields, lookup));
128
+ return items;
129
+ }
130
+ if ('all' in branch) {
131
+ const where = this.buildAllMatchWhere({
132
+ matches: branch.all,
133
+ req,
134
+ iamContext,
135
+ userType,
136
+ lookup,
137
+ });
138
+ if (where) {
139
+ items.push(where);
140
+ }
141
+ return items;
142
+ }
143
+ return items;
144
+ }, []);
145
+ }
146
+ buildAllMatchWhere(params) {
147
+ const { matches, req, iamContext, userType, lookup } = params;
148
+ if (!matches.length) {
149
+ return null;
150
+ }
151
+ const where = this.buildBaseWhere(lookup);
152
+ for (const match of matches) {
153
+ const rawValue = this.getValueFromSource(match.valueFrom, {
154
+ req,
155
+ iamContext,
156
+ userType,
157
+ });
158
+ const value = this.castValue(rawValue, match.cast);
159
+ if (!this.hasValue(value)) {
160
+ return null;
161
+ }
162
+ where[match.field] = value;
163
+ }
164
+ return where;
165
+ }
166
+ buildNullFieldsWhere(fields, lookup) {
167
+ return fields.reduce((where, field) => {
168
+ where[field] = (0, typeorm_2.IsNull)();
169
+ return where;
170
+ }, this.buildBaseWhere(lookup));
171
+ }
172
+ buildBaseWhere(lookup) {
173
+ if (!lookup) {
174
+ return {};
175
+ }
176
+ return {
177
+ [lookup.lookupField]: lookup.entityId,
178
+ };
179
+ }
180
+ normalizeWhereResult(where) {
181
+ if (where.length === 1) {
182
+ return where[0];
183
+ }
184
+ return where;
185
+ }
186
+ getValueFromSource(source, context) {
187
+ if (typeof source === 'function') {
188
+ return source(context);
189
+ }
190
+ if (source.startsWith('iam.')) {
191
+ return this.getValueByPath(context.iamContext, source.slice(4));
192
+ }
193
+ if (source.startsWith('req.')) {
194
+ return this.getValueByPath(context.req, source.slice(4));
195
+ }
196
+ return undefined;
197
+ }
198
+ getValueByPath(source, path) {
199
+ return path.split('.').reduce((current, key) => {
200
+ return current?.[key];
201
+ }, source);
202
+ }
203
+ castValue(value, cast) {
204
+ if (!this.hasValue(value)) {
205
+ return value;
206
+ }
207
+ if (cast === 'string') {
208
+ return String(value);
209
+ }
210
+ if (cast === 'number') {
211
+ const numberValue = Number(value);
212
+ return Number.isNaN(numberValue) ? undefined : numberValue;
213
+ }
214
+ if (cast === 'boolean') {
215
+ if (value === true || value === false) {
216
+ return value;
217
+ }
218
+ if (value === 'true') {
219
+ return true;
220
+ }
221
+ if (value === 'false') {
222
+ return false;
223
+ }
224
+ return Boolean(value);
225
+ }
226
+ return value;
227
+ }
228
+ normalizeEntityId(value) {
229
+ if (!this.hasValue(value)) {
230
+ return null;
231
+ }
232
+ if (typeof value === 'string' || typeof value === 'number') {
233
+ return value;
234
+ }
235
+ if (typeof value === 'bigint') {
236
+ return value.toString();
237
+ }
238
+ return null;
239
+ }
240
+ hasValue(value) {
241
+ return value !== null && value !== undefined && value !== '';
242
+ }
243
+ };
244
+ exports.IamEntityAccessService = IamEntityAccessService;
245
+ exports.IamEntityAccessService = IamEntityAccessService = __decorate([
246
+ (0, common_1.Injectable)(),
247
+ __param(0, (0, typeorm_1.InjectDataSource)()),
248
+ __metadata("design:paramtypes", [typeorm_2.DataSource])
249
+ ], IamEntityAccessService);
250
+ //# sourceMappingURL=iam-entity-access.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.service.js","sourceRoot":"","sources":["../../src/services/iam-entity-access.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { EntityFieldMatch, IamAccessValueContext } from '../interfaces/iam-entity-access.interface';
2
+ import { FindOptionsWhere } from 'typeorm';
3
+ import { PaginateQuery } from 'nestjs-paginate';
4
+ import { IAM_QUERY_SCOPE_WHERE_KEY } from '../constants/iam-decorator-key.const';
5
+ export type AccessValueCast = 'string' | 'number' | 'boolean';
6
+ export type AccessValueSource = `iam.${string}` | `req.${string}` | ((ctx: IamAccessValueContext) => unknown);
7
+ export type EntityAccessBranch<T = any> = {
8
+ all: EntityFieldMatch<T>[];
9
+ } | {
10
+ nullFields: (keyof T & string)[];
11
+ };
12
+ export type IamScopedWhere<T = any> = FindOptionsWhere<T> | FindOptionsWhere<T>[] | undefined;
13
+ export type IamScopedPaginateQuery<T = any> = PaginateQuery & {
14
+ [IAM_QUERY_SCOPE_WHERE_KEY]?: IamScopedWhere<T>;
15
+ };
16
+ export type IamScopedFindOneQuery<T = any> = Record<string, any> & {
17
+ [IAM_QUERY_SCOPE_WHERE_KEY]?: IamScopedWhere<T>;
18
+ };
19
+ //# sourceMappingURL=iam-entity-access.type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.type.d.ts","sourceRoot":"","sources":["../../src/types/iam-entity-access.type.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACtB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AAEjF,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE9D,MAAM,MAAM,iBAAiB,GACzB,OAAO,MAAM,EAAE,GACf,OAAO,MAAM,EAAE,GACf,CAAC,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC,CAAC;AAE9C,MAAM,MAAM,kBAAkB,CAAC,CAAC,GAAG,GAAG,IAClC;IACE,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5B,GACD;IACE,UAAU,EAAE,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC;CAClC,CAAC;AAEN,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,GAAG,IAC9B,gBAAgB,CAAC,CAAC,CAAC,GACnB,gBAAgB,CAAC,CAAC,CAAC,EAAE,GACrB,SAAS,CAAC;AAEd,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,GAAG,IAAI,aAAa,GAAG;IAC5D,CAAC,yBAAyB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG;IACjE,CAAC,yBAAyB,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CACjD,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
4
+ //# sourceMappingURL=iam-entity-access.type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iam-entity-access.type.js","sourceRoot":"","sources":["../../src/types/iam-entity-access.type.ts"],"names":[],"mappings":";;AAMA,kFAAiF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mondart/nestjs-common-module-iam",
3
- "version": "2.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Reusable IAM (Identity and Access Management) utilities for NestJS.",
5
5
  "author": {
6
6
  "name": "Mondart"
@@ -14,7 +14,11 @@
14
14
  "README.md"
15
15
  ],
16
16
  "scripts": {
17
- "build": "tsc -p tsconfig.json"
17
+ "build": "tsc -p tsconfig.json",
18
+ "test": "jest",
19
+ "test:watch": "jest --watch",
20
+ "test:cov": "jest --coverage",
21
+ "test:debug": "node --inspect-brk -r ts-node/register ./node_modules/.bin/jest --runInBand"
18
22
  },
19
23
  "dependencies": {
20
24
  "@mondart/nestjs-common-module-core": "^3.1.0"
@@ -33,5 +37,14 @@
33
37
  },
34
38
  "publishConfig": {
35
39
  "access": "public"
40
+ },
41
+ "devDependencies": {
42
+ "@nestjs/testing": "^11.1.27",
43
+ "@types/jest": "^30.0.0",
44
+ "@types/supertest": "^7.2.0",
45
+ "jest": "^30.4.2",
46
+ "supertest": "^7.2.2",
47
+ "ts-jest": "^29.4.11",
48
+ "ts-node": "^10.9.2"
36
49
  }
37
- }
50
+ }
@@ -1,2 +0,0 @@
1
- export declare const GetOwnerIdDecorator: (...dataOrPipes: unknown[]) => ParameterDecorator;
2
- //# sourceMappingURL=get-owner-id.decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-owner-id.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/get-owner-id.decorator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,mBAAmB,mDAU/B,CAAC"}
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetOwnerIdDecorator = void 0;
4
- const common_1 = require("@nestjs/common");
5
- const nestjs_common_module_core_1 = require("@mondart/nestjs-common-module-core");
6
- exports.GetOwnerIdDecorator = (0, common_1.createParamDecorator)((data, ctx) => {
7
- const request = ctx.switchToHttp().getRequest();
8
- if (!request.isOwnerRoute)
9
- return null;
10
- const iamContext = (0, nestjs_common_module_core_1.getIamContext)(request);
11
- return iamContext?.user?.contactId;
12
- });
13
- //# sourceMappingURL=get-owner-id.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-owner-id.decorator.js","sourceRoot":"","sources":["../../src/decorators/get-owner-id.decorator.ts"],"names":[],"mappings":";;;AAAA,2CAAwE;AACxE,kFAAmE;AAEtD,QAAA,mBAAmB,GAAG,IAAA,6BAAoB,EACrD,CAAC,IAAa,EAAE,GAAqB,EAAE,EAAE;IACvC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,EAAE,CAAC,UAAU,EAAE,CAAC;IAEhD,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,UAAU,GAAG,IAAA,yCAAa,EAAC,OAAO,CAAC,CAAC;IAE1C,OAAO,UAAU,EAAE,IAAI,EAAE,SAAS,CAAC;AACrC,CAAC,CACF,CAAC"}
@@ -1,2 +0,0 @@
1
- export declare const IamPublicRouteDecorator: () => import("@nestjs/common").CustomDecorator<string>;
2
- //# sourceMappingURL=iam-public.decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iam-public.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/iam-public.decorator.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,uBAAuB,wDACC,CAAC"}
@@ -1,8 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.IamPublicRouteDecorator = void 0;
4
- const iam_decorator_key_const_1 = require("../constants/iam-decorator-key.const");
5
- const common_1 = require("@nestjs/common");
6
- const IamPublicRouteDecorator = () => (0, common_1.SetMetadata)(iam_decorator_key_const_1.IAM_PUBLIC_ROUTE, true);
7
- exports.IamPublicRouteDecorator = IamPublicRouteDecorator;
8
- //# sourceMappingURL=iam-public.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"iam-public.decorator.js","sourceRoot":"","sources":["../../src/decorators/iam-public.decorator.ts"],"names":[],"mappings":";;;AAAA,kFAAwE;AACxE,2CAA6C;AAEtC,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAC1C,IAAA,oBAAW,EAAC,0CAAgB,EAAE,IAAI,CAAC,CAAC;AADzB,QAAA,uBAAuB,2BACE"}
@@ -1,14 +0,0 @@
1
- import { BaseModelEntity } from '@mondart/nestjs-common-module-core';
2
- export declare const OWNS_ENTITY_KEY = "owns_entity";
3
- export type OwnerConditions<T extends BaseModelEntity = BaseModelEntity> = {
4
- ownerPropertyKey: keyof T;
5
- ownerEntityId: (req: any) => string | number;
6
- };
7
- export interface OwnsEntityOptions<T extends BaseModelEntity = BaseModelEntity> {
8
- entity: new (...args: any[]) => T;
9
- entityPropertyKey: keyof T;
10
- requestEntityId: (req: any) => string | number;
11
- ownerConditions: OwnerConditions<T> | OwnerConditions<T>[];
12
- }
13
- export declare const OwnsEntity: <T extends BaseModelEntity = BaseModelEntity>(option: OwnsEntityOptions<T>) => import("@nestjs/common").CustomDecorator<string>;
14
- //# sourceMappingURL=owns-entity.decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"owns-entity.decorator.d.ts","sourceRoot":"","sources":["../../src/decorators/owns-entity.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAErE,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,eAAe,GAAG,eAAe,IAAI;IACzE,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1B,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC;CAC9C,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAChC,CAAC,SAAS,eAAe,GAAG,eAAe;IAE3C,MAAM,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,iBAAiB,EAAE,MAAM,CAAC,CAAC;IAC3B,eAAe,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,MAAM,GAAG,MAAM,CAAC;IAC/C,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;CAC5D;AAED,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,eAAe,GAAG,eAAe,EACpE,QAAQ,iBAAiB,CAAC,CAAC,CAAC,qDACW,CAAC"}