@rapidrest/core 1.6.0 → 1.7.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.
@@ -2,12 +2,42 @@
2
2
  // Copyright (C) 2020-2026 Jean-Philippe Steinmetz
3
3
  ///////////////////////////////////////////////////////////////////////////////
4
4
  import "reflect-metadata";
5
+ import { UserUtils } from "./UserUtils.js";
5
6
  /**
6
7
  * Utility class for working with objects.
7
8
  *
8
9
  * @author Jean-Philippe Steinmetz
9
10
  */
10
11
  export class ObjectUtils {
12
+ /**
13
+ * Deletes all properties from the given object(s) that the specified user does not have scope to read.
14
+ *
15
+ * @param obj The object(s) to process.
16
+ * @param user The user whose scope permissions will be tested.
17
+ * @param clazz The class type that contains the @RequiresScope metadata.
18
+ * @param recurse Set to `true` to validate all child objects.
19
+ */
20
+ static deleteScopedProps(obj, user, clazz, recurse) {
21
+ const objs = Array.isArray(obj) ? obj : [obj];
22
+ for (const obj of objs) {
23
+ const metadataObj = !clazz || obj instanceof clazz ? obj : new clazz();
24
+ // Iterate through all properties of the object
25
+ for (const member of Object.getOwnPropertyNames(obj)) {
26
+ if (member === "constructor")
27
+ continue;
28
+ // Extract the list of required scopes for the property
29
+ const scopes = Reflect.getMetadata("rrst:scopes", metadataObj, member);
30
+ // If the user does not have at least one of the specified scopes, delete the property from the object.
31
+ if (scopes && !UserUtils.hasScopes(user, scopes)) {
32
+ delete obj[member];
33
+ }
34
+ // If recursion is requested, process the child object
35
+ if (recurse && typeof obj[member] === "object") {
36
+ ObjectUtils.deleteScopedProps(obj[member], user, undefined, recurse);
37
+ }
38
+ }
39
+ }
40
+ }
11
41
  /**
12
42
  * Performs validation of the given object or array. Validation is performed by scanning the object class for properties
13
43
  * decorated with `@Validator` and executing the provided validation function.
@@ -22,7 +52,7 @@ export class ObjectUtils {
22
52
  const metadataObj = !clazz || obj instanceof clazz ? obj : new clazz();
23
53
  // Iterate through all properties of the object
24
54
  for (const member of Object.getOwnPropertyNames(obj)) {
25
- if (member === 'constructor')
55
+ if (member === "constructor")
26
56
  continue;
27
57
  const nullable = Reflect.getMetadata("rrst:nullable", metadataObj, member);
28
58
  // Value of '0' is valid. Don't throw on such values.
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectUtils.js","sourceRoot":"","sources":["../../src/ObjectUtils.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,kBAAkB,CAAC;AAG1B;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACpB;;;;;;;OAOG;IACI,MAAM,CAAC,QAAQ,CAAC,GAAQ,EAAE,KAAW,EAAE,OAAiB;QAC3D,MAAM,IAAI,GAAU,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,WAAW,GAAQ,CAAC,KAAK,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;YAE5E,+CAA+C;YAC/C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,MAAM,KAAK,aAAa;oBAAE,SAAS;gBAEvC,MAAM,QAAQ,GAAQ,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;gBAChF,qDAAqD;gBACrD,IAAI,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC;oBACzF,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,kBAAkB,CAAC,CAAC;gBAC1D,CAAC;gBAED,MAAM,SAAS,GAAkC,OAAO,CAAC,WAAW,CAAC,gBAAgB,EAAE,WAAW,EAAE,MAAM,CAAC,CAAC;gBAC5G,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACD,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;oBACzC,CAAC;oBAAC,OAAO,GAAQ,EAAE,CAAC;wBAChB,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBACrE,CAAC;gBACL,CAAC;gBAED,sDAAsD;gBACtD,IAAI,OAAO,IAAI,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,EAAE,CAAC;oBAC7C,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC/C,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;CACJ"}
1
+ {"version":3,"file":"ObjectUtils.js","sourceRoot":"","sources":["../../src/ObjectUtils.ts"],"names":[],"mappings":"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"}
@@ -102,5 +102,34 @@ export class UserUtils {
102
102
  }
103
103
  return false;
104
104
  }
105
+ /**
106
+ * Returns `true` if the given user object has a scope with the specified name, otherwise returns `false`.
107
+ *
108
+ * @param user The user object to inspect.
109
+ * @param scope The scope to search for.
110
+ */
111
+ static hasScope(user, scope) {
112
+ let result = false;
113
+ if (user && Array.isArray(user.scopes)) {
114
+ result = user.scopes.includes(scope);
115
+ }
116
+ return result;
117
+ }
118
+ /**
119
+ * Returns `true` if the given user object has at least one of the specified scopes, otherwise returns `false`.
120
+ *
121
+ * @param user The user object to inspect.
122
+ * @param scope The list of scopes to search for.
123
+ */
124
+ static hasScopes(user, scopes) {
125
+ if (user && Array.isArray(user.scopes)) {
126
+ for (const scope of scopes) {
127
+ if (UserUtils.hasScope(user, scope)) {
128
+ return true;
129
+ }
130
+ }
131
+ }
132
+ return false;
133
+ }
105
134
  }
106
135
  //# sourceMappingURL=UserUtils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"UserUtils.js","sourceRoot":"","sources":["../../src/UserUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"UserUtils.js","sourceRoot":"","sources":["../../src/UserUtils.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,19 @@ export function Logger(target, propertyKey) {
78
78
  export function Nullable(target, propertyKey) {
79
79
  Reflect.defineMetadata("rrst:nullable", true, target, propertyKey);
80
80
  }
81
+ /**
82
+ * Indicates that the client's token must carry at least one of the specified OAuth-style scope(s) to have read access
83
+ * to the decorated property. When a client does not have the defined scope the property is removed from the final object
84
+ * construction.
85
+ *
86
+ * @param scope The scope that the authenticated user's token must carry to read the property.
87
+ */
88
+ export function RequiresScope(scope) {
89
+ return function (target, propertyKey) {
90
+ const scopes = Array.isArray(scope) ? scope : [scope];
91
+ Reflect.defineMetadata("rrst:scopes", scopes, target, propertyKey);
92
+ };
93
+ }
81
94
  /**
82
95
  * Apply this to a property to specify the function that will be used to perform validation of the value.
83
96
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectDecorators.js","sourceRoot":"","sources":["../../../src/decorators/ObjectDecorators.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,kDAAkD;AAClD,+EAA+E;AAC/E,OAAO,kBAAkB,CAAC;AAG1B;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAW,EAAE,WAAmB;IACpD,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,MAAM,CAAC,IAAS,EAAE,OAAyB;IACvD,OAAO,UAAU,MAAW,EAAE,WAA4B;QACtD,OAAO,GAAG;YACN,GAAG,OAAO;YACV,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,SAAS;SACnC,CAAC;QACF,OAAO,CAAC,cAAc,CAClB,mBAAmB,EACnB;YACI,OAAO;YACP,IAAI;SACP,EACD,MAAM,EACN,WAAW,CACd,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE;YACvC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;SACnB,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,IAAI,CAAC,MAAW,EAAE,WAAmB,EAAE,UAA8B;IACjF,OAAO,CAAC,cAAc,CAAC,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,MAAM,CAAC,IAAa,EAAE,eAAoB,SAAS;IAC/D,OAAO,UAAU,MAAW,EAAE,WAA4B;QACtD,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACrF,OAAO,CAAC,cAAc,CAAC,0BAA0B,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QACtF,MAAM,GAAG,GAAG,KAAK,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE;YACvC,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,SAAS;SACnB,CAAC,CAAC;IACP,CAAC,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,MAAW,EAAE,WAA4B;IAC5D,OAAO,CAAC,cAAc,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACvE,MAAM,GAAG,GAAG,KAAK,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;IACvC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE;QACvC,UAAU,EAAE,IAAI;QAChB,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,SAAS;KACnB,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAW,EAAE,WAA4B;IAC9D,OAAO,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACvE,CAAC;AAWD;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAuB;IAC7C,OAAO,UAAU,MAAW,EAAE,WAA4B;QACtD,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;IACxE,CAAC,CAAA;AACL,CAAC"}
1
+ {"version":3,"file":"ObjectDecorators.js","sourceRoot":"","sources":["../../../src/decorators/ObjectDecorators.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,20 @@
1
1
  import "reflect-metadata";
2
+ import { JWTUser } from "./JWTUtils.js";
2
3
  /**
3
4
  * Utility class for working with objects.
4
5
  *
5
6
  * @author Jean-Philippe Steinmetz
6
7
  */
7
8
  export declare class ObjectUtils {
9
+ /**
10
+ * Deletes all properties from the given object(s) that the specified user does not have scope to read.
11
+ *
12
+ * @param obj The object(s) to process.
13
+ * @param user The user whose scope permissions will be tested.
14
+ * @param clazz The class type that contains the @RequiresScope metadata.
15
+ * @param recurse Set to `true` to validate all child objects.
16
+ */
17
+ static deleteScopedProps(obj: any, user?: JWTUser, clazz?: any, recurse?: boolean): void;
8
18
  /**
9
19
  * Performs validation of the given object or array. Validation is performed by scanning the object class for properties
10
20
  * decorated with `@Validator` and executing the provided validation function.
@@ -46,4 +46,18 @@ export declare class UserUtils {
46
46
  * @param orgUid The unique identifier of an organization whose role will be verified.
47
47
  */
48
48
  static hasRoles(user: any, roles?: string[], orgUid?: string): boolean;
49
+ /**
50
+ * Returns `true` if the given user object has a scope with the specified name, otherwise returns `false`.
51
+ *
52
+ * @param user The user object to inspect.
53
+ * @param scope The scope to search for.
54
+ */
55
+ static hasScope(user: any, scope: string): boolean;
56
+ /**
57
+ * Returns `true` if the given user object has at least one of the specified scopes, otherwise returns `false`.
58
+ *
59
+ * @param user The user object to inspect.
60
+ * @param scope The list of scopes to search for.
61
+ */
62
+ static hasScopes(user: any, scopes: string[]): boolean;
49
63
  }
@@ -43,6 +43,14 @@ export declare function Nullable(target: any, propertyKey: string | symbol): voi
43
43
  * @throws An exception if the value cannot be validated.
44
44
  */
45
45
  export type ValidatorFunction = (value: any) => any;
46
+ /**
47
+ * Indicates that the client's token must carry at least one of the specified OAuth-style scope(s) to have read access
48
+ * to the decorated property. When a client does not have the defined scope the property is removed from the final object
49
+ * construction.
50
+ *
51
+ * @param scope The scope that the authenticated user's token must carry to read the property.
52
+ */
53
+ export declare function RequiresScope(scope: string | string[]): (target: any, propertyKey: string | symbol) => void;
46
54
  /**
47
55
  * Apply this to a property to specify the function that will be used to perform validation of the value.
48
56
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rapidrest/core",
3
- "version": "1.6.0",
3
+ "version": "1.7.0",
4
4
  "description": "A collection of common utilities and core functionality for rapidly building RESTful applications.",
5
5
  "repository": "https://github.com/rapidrest/core.git",
6
6
  "author": "RapidREST <rapidrests@gmail.com>",