@prosopo/user-access-policy 3.5.19 → 3.5.28

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 (93) hide show
  1. package/CHANGELOG.md +84 -0
  2. package/dist/.export.js +21 -0
  3. package/dist/api/.export.js +11 -0
  4. package/dist/api/delete/.export.js +1 -0
  5. package/dist/api/{deleteAllRulesEndpoint.js → delete/deleteAllRules.js} +10 -9
  6. package/dist/api/delete/deleteRuleGroups.js +52 -0
  7. package/dist/api/delete/deleteRules.js +43 -0
  8. package/dist/api/read/.export.js +1 -0
  9. package/dist/api/read/fetchRules.js +43 -0
  10. package/dist/api/read/findRuleIds.js +50 -0
  11. package/dist/api/read/getMissingIds.js +41 -0
  12. package/dist/api/ruleApiRoutes.js +131 -0
  13. package/dist/api/rulesApiClient.js +93 -0
  14. package/dist/api/write/.export.js +1 -0
  15. package/dist/api/write/insertRules.js +102 -0
  16. package/dist/api/write/rehashRules.js +57 -0
  17. package/dist/cjs/.export.cjs +21 -0
  18. package/dist/cjs/api/.export.cjs +11 -0
  19. package/dist/cjs/api/delete/.export.cjs +1 -0
  20. package/dist/cjs/api/{deleteAllRulesEndpoint.cjs → delete/deleteAllRules.cjs} +9 -8
  21. package/dist/cjs/api/delete/deleteRuleGroups.cjs +52 -0
  22. package/dist/cjs/api/delete/deleteRules.cjs +43 -0
  23. package/dist/cjs/api/read/.export.cjs +1 -0
  24. package/dist/cjs/api/read/fetchRules.cjs +43 -0
  25. package/dist/cjs/api/read/findRuleIds.cjs +50 -0
  26. package/dist/cjs/api/read/getMissingIds.cjs +41 -0
  27. package/dist/cjs/api/ruleApiRoutes.cjs +131 -0
  28. package/dist/cjs/api/rulesApiClient.cjs +93 -0
  29. package/dist/cjs/api/write/.export.cjs +1 -0
  30. package/dist/cjs/api/write/insertRules.cjs +102 -0
  31. package/dist/cjs/api/write/rehashRules.cjs +57 -0
  32. package/dist/cjs/mongoose/.export.cjs +4 -0
  33. package/dist/cjs/mongoose/mongooseRuleSchema.cjs +36 -0
  34. package/dist/cjs/redis/.export.cjs +6 -0
  35. package/dist/cjs/redis/reader/redisAggregate.cjs +60 -0
  36. package/dist/cjs/redis/reader/redisRulesQuery.cjs +99 -0
  37. package/dist/cjs/redis/reader/redisRulesReader.cjs +230 -0
  38. package/dist/cjs/redis/redisClient.cjs +67 -0
  39. package/dist/cjs/redis/redisRuleIndex.cjs +50 -0
  40. package/dist/cjs/redis/redisRulesStorage.cjs +22 -9
  41. package/dist/cjs/redis/redisRulesWriter.cjs +91 -64
  42. package/dist/cjs/rule.cjs +8 -0
  43. package/dist/cjs/ruleInput/.export.cjs +9 -0
  44. package/dist/cjs/ruleInput/policyInput.cjs +25 -0
  45. package/dist/cjs/ruleInput/ruleInput.cjs +50 -0
  46. package/dist/cjs/ruleInput/userScopeInput.cjs +55 -0
  47. package/dist/cjs/ruleRecord.cjs +23 -0
  48. package/dist/cjs/rulesStorage.cjs +8 -0
  49. package/dist/cjs/transformRule.cjs +77 -0
  50. package/dist/mongoose/.export.js +4 -0
  51. package/dist/mongoose/mongooseRuleSchema.js +36 -0
  52. package/dist/redis/.export.js +6 -0
  53. package/dist/redis/reader/redisAggregate.js +60 -0
  54. package/dist/redis/reader/redisRulesQuery.js +99 -0
  55. package/dist/redis/reader/redisRulesReader.js +213 -0
  56. package/dist/redis/redisClient.js +67 -0
  57. package/dist/redis/redisRuleIndex.js +50 -0
  58. package/dist/redis/redisRulesStorage.js +23 -10
  59. package/dist/redis/redisRulesWriter.js +91 -64
  60. package/dist/rule.js +8 -0
  61. package/dist/ruleInput/.export.js +9 -0
  62. package/dist/ruleInput/policyInput.js +25 -0
  63. package/dist/ruleInput/ruleInput.js +50 -0
  64. package/dist/ruleInput/userScopeInput.js +55 -0
  65. package/dist/ruleRecord.js +23 -0
  66. package/dist/rulesStorage.js +8 -0
  67. package/dist/transformRule.js +77 -0
  68. package/entries.ts +20 -0
  69. package/package.json +34 -18
  70. package/vite.cjs.config.ts +4 -1
  71. package/vite.esm.config.ts +6 -1
  72. package/dist/accessPolicy.js +0 -80
  73. package/dist/accessPolicyResolver.js +0 -31
  74. package/dist/accessRules.js +0 -11
  75. package/dist/api/accessRuleApiRoutes.js +0 -79
  76. package/dist/api/accessRulesApiClient.js +0 -38
  77. package/dist/api/deleteRulesEndpoint.js +0 -34
  78. package/dist/api/insertRulesEndpoint.js +0 -62
  79. package/dist/cjs/accessPolicy.cjs +0 -80
  80. package/dist/cjs/accessPolicyResolver.cjs +0 -31
  81. package/dist/cjs/accessRules.cjs +0 -11
  82. package/dist/cjs/api/accessRuleApiRoutes.cjs +0 -79
  83. package/dist/cjs/api/accessRulesApiClient.cjs +0 -38
  84. package/dist/cjs/api/deleteRulesEndpoint.cjs +0 -34
  85. package/dist/cjs/api/insertRulesEndpoint.cjs +0 -62
  86. package/dist/cjs/index.cjs +0 -31
  87. package/dist/cjs/redis/redisRulesIndex.cjs +0 -138
  88. package/dist/cjs/redis/redisRulesReader.cjs +0 -142
  89. package/dist/cjs/util.cjs +0 -5
  90. package/dist/index.js +0 -32
  91. package/dist/redis/redisRulesIndex.js +0 -138
  92. package/dist/redis/redisRulesReader.js +0 -125
  93. package/dist/util.js +0 -5
@@ -0,0 +1,102 @@
1
+ import { ApiEndpointResponseStatus } from "@prosopo/api-route";
2
+ import { LogLevel } from "@prosopo/common";
3
+ import { z } from "zod";
4
+ import { policyScopeInput, accessPolicyInput } from "../../ruleInput/policyInput.js";
5
+ import { userScopeInput } from "../../ruleInput/userScopeInput.js";
6
+ class InsertRulesEndpoint {
7
+ constructor(accessRulesWriter, logger) {
8
+ this.accessRulesWriter = accessRulesWriter;
9
+ this.logger = logger;
10
+ }
11
+ getRequestArgsSchema() {
12
+ return z.array(
13
+ z.object({
14
+ accessPolicy: accessPolicyInput,
15
+ policyScopes: z.array(policyScopeInput).optional(),
16
+ groupId: z.string().optional(),
17
+ userScopes: z.array(userScopeInput),
18
+ expiresUnixTimestamp: z.number().optional()
19
+ })
20
+ );
21
+ }
22
+ async processRequest(args) {
23
+ const timeoutPromise = new Promise((resolve) => {
24
+ setTimeout(() => {
25
+ resolve({
26
+ status: ApiEndpointResponseStatus.PROCESSING
27
+ });
28
+ }, 5e3);
29
+ });
30
+ const userScopesCount = args.reduce(
31
+ (userScopesCount2, group) => userScopesCount2 + group.userScopes.length,
32
+ 0
33
+ );
34
+ const createRulesPromise = this.createRuleGroups(args).then((insertedIds) => {
35
+ this.logger.info(() => ({
36
+ msg: "Endpoint inserted access rules",
37
+ data: {
38
+ userScopesCount,
39
+ insertedCount: insertedIds.length,
40
+ uniqueIdsCount: new Set(insertedIds).size
41
+ }
42
+ }));
43
+ this.logger.debug(() => ({
44
+ msg: "Inserted access rules details",
45
+ data: {
46
+ insertedIds,
47
+ input: args
48
+ }
49
+ }));
50
+ return {
51
+ status: ApiEndpointResponseStatus.SUCCESS
52
+ };
53
+ }).catch((error) => {
54
+ if (LogLevel.enum.debug === this.logger.getLogLevel()) {
55
+ this.logger.error(() => ({
56
+ err: error,
57
+ data: { args },
58
+ msg: "Failed to insert access rules"
59
+ }));
60
+ }
61
+ return {
62
+ status: ApiEndpointResponseStatus.FAIL
63
+ };
64
+ });
65
+ return Promise.race([timeoutPromise, createRulesPromise]);
66
+ }
67
+ async createRuleGroups(groups) {
68
+ const ruleIdPromises = groups.map((group) => this.createRulesGroup(group));
69
+ const ruleIdSets = await Promise.all(ruleIdPromises);
70
+ return ruleIdSets.flat();
71
+ }
72
+ async createRulesGroup(group) {
73
+ const ruleEntries = [];
74
+ const policyScopes = group.policyScopes || [];
75
+ for (const userScope of group.userScopes) {
76
+ const ruleBase = {
77
+ ...group.accessPolicy,
78
+ ...userScope,
79
+ ...group.groupId ? { groupId: group.groupId } : {}
80
+ };
81
+ if (policyScopes.length > 0) {
82
+ for (const policyScope of policyScopes) {
83
+ ruleEntries.push({
84
+ rule: {
85
+ ...ruleBase,
86
+ ...policyScope
87
+ }
88
+ });
89
+ }
90
+ } else {
91
+ ruleEntries.push({
92
+ rule: ruleBase,
93
+ expiresUnixTimestamp: group.expiresUnixTimestamp
94
+ });
95
+ }
96
+ }
97
+ return this.accessRulesWriter.insertRules(ruleEntries);
98
+ }
99
+ }
100
+ export {
101
+ InsertRulesEndpoint
102
+ };
@@ -0,0 +1,57 @@
1
+ import { ApiEndpointResponseStatus } from "@prosopo/api-route";
2
+ class RehashRulesEndpoint {
3
+ constructor(accessRulesStorage, logger) {
4
+ this.accessRulesStorage = accessRulesStorage;
5
+ this.logger = logger;
6
+ }
7
+ getRequestArgsSchema() {
8
+ }
9
+ async processRequest() {
10
+ await this.accessRulesStorage.fetchAllRuleIds(async (ruleIds) => {
11
+ this.logger.info(() => ({
12
+ msg: "Fetched rule ids batch",
13
+ data: {
14
+ count: ruleIds.length,
15
+ ruleIds
16
+ }
17
+ }));
18
+ const ruleEntries = await this.accessRulesStorage.fetchRules(ruleIds);
19
+ this.logger.info(() => ({
20
+ msg: "Fetched rules",
21
+ data: {
22
+ count: ruleEntries.length
23
+ }
24
+ }));
25
+ if (ruleEntries.length !== ruleIds.length) {
26
+ this.logger.warn(() => ({
27
+ msg: "Fetched rules count is not equal to the requested count",
28
+ data: {
29
+ fetchedCount: ruleEntries.length,
30
+ requestedCount: ruleIds.length
31
+ }
32
+ }));
33
+ }
34
+ await this.accessRulesStorage.deleteRules(ruleIds);
35
+ this.logger.info(() => ({
36
+ msg: "Deleted rules",
37
+ data: {
38
+ count: ruleIds.length
39
+ }
40
+ }));
41
+ await this.accessRulesStorage.insertRules(ruleEntries);
42
+ this.logger.info(() => ({
43
+ msg: "Inserted rules",
44
+ data: {
45
+ count: ruleEntries.length
46
+ }
47
+ }));
48
+ });
49
+ return {
50
+ status: ApiEndpointResponseStatus.SUCCESS,
51
+ data: {}
52
+ };
53
+ }
54
+ }
55
+ export {
56
+ RehashRulesEndpoint
57
+ };
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ require("./ruleInput/.export.cjs");
4
+ const transformRule = require("./transformRule.cjs");
5
+ const rule = require("./rule.cjs");
6
+ const rulesStorage = require("./rulesStorage.cjs");
7
+ const ruleRecord = require("./ruleRecord.cjs");
8
+ const ruleInput = require("./ruleInput/ruleInput.cjs");
9
+ const policyInput = require("./ruleInput/policyInput.cjs");
10
+ const userScopeInput = require("./ruleInput/userScopeInput.cjs");
11
+ exports.makeAccessRuleHash = transformRule.makeAccessRuleHash;
12
+ exports.transformAccessRuleIntoRecord = transformRule.transformAccessRuleIntoRecord;
13
+ exports.transformAccessRuleRecordIntoRule = transformRule.transformAccessRuleRecordIntoRule;
14
+ exports.AccessPolicyType = rule.AccessPolicyType;
15
+ exports.FilterScopeMatch = rulesStorage.FilterScopeMatch;
16
+ exports.getUserScopeRecordFromAccessRuleRecord = ruleRecord.getUserScopeRecordFromAccessRuleRecord;
17
+ exports.userScopeRecordFields = ruleRecord.userScopeRecordFields;
18
+ exports.accessRuleInput = ruleInput.accessRuleInput;
19
+ exports.accessPolicyInput = policyInput.accessPolicyInput;
20
+ exports.policyScopeInput = policyInput.policyScopeInput;
21
+ exports.userScopeInput = userScopeInput.userScopeInput;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ require("./delete/.export.cjs");
4
+ require("./read/.export.cjs");
5
+ require("./write/.export.cjs");
6
+ const ruleApiRoutes = require("./ruleApiRoutes.cjs");
7
+ const rulesApiClient = require("./rulesApiClient.cjs");
8
+ exports.AccessRuleApiRoutes = ruleApiRoutes.AccessRuleApiRoutes;
9
+ exports.accessRuleApiPaths = ruleApiRoutes.accessRuleApiPaths;
10
+ exports.getExpressApiRuleRateLimits = ruleApiRoutes.getExpressApiRuleRateLimits;
11
+ exports.AccessRulesApiClient = rulesApiClient.AccessRulesApiClient;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -1,14 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const apiRoute = require("@prosopo/api-route");
4
- const zod = require("zod");
5
- const deleteAllRulesEndpointSchema = zod.z.object({});
6
4
  class DeleteAllRulesEndpoint {
7
- constructor(accessRulesStorage) {
5
+ constructor(accessRulesStorage, logger) {
8
6
  this.accessRulesStorage = accessRulesStorage;
7
+ this.logger = logger;
9
8
  }
10
- async processRequest(args) {
9
+ getRequestArgsSchema() {
10
+ }
11
+ async processRequest() {
11
12
  const deletedCount = await this.accessRulesStorage.deleteAllRules();
13
+ this.logger.info(() => ({
14
+ msg: "Endpoint deleted all access rules",
15
+ data: { deletedCount }
16
+ }));
12
17
  return {
13
18
  status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
14
19
  data: {
@@ -16,9 +21,5 @@ class DeleteAllRulesEndpoint {
16
21
  }
17
22
  };
18
23
  }
19
- getRequestArgsSchema() {
20
- return deleteAllRulesEndpointSchema;
21
- }
22
24
  }
23
25
  exports.DeleteAllRulesEndpoint = DeleteAllRulesEndpoint;
24
- exports.deleteAllRulesEndpointSchema = deleteAllRulesEndpointSchema;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const zod = require("zod");
5
+ const rulesStorage = require("../../rulesStorage.cjs");
6
+ class DeleteRuleGroupsEndpoint {
7
+ constructor(accessRulesStorage, logger) {
8
+ this.accessRulesStorage = accessRulesStorage;
9
+ this.logger = logger;
10
+ }
11
+ getRequestArgsSchema() {
12
+ return zod.z.array(
13
+ zod.z.object({
14
+ clientIds: zod.z.string().array(),
15
+ groupId: zod.z.string()
16
+ })
17
+ );
18
+ }
19
+ async processRequest(args) {
20
+ const foundRuleIdPromises = args.flatMap(
21
+ (ruleToDelete) => ruleToDelete.clientIds.map(
22
+ (clientId) => this.accessRulesStorage.findRuleIds({
23
+ policyScope: {
24
+ clientId
25
+ },
26
+ policyScopeMatch: rulesStorage.FilterScopeMatch.Exact,
27
+ groupId: ruleToDelete.groupId
28
+ })
29
+ )
30
+ );
31
+ const foundRuleIds = await Promise.all(foundRuleIdPromises);
32
+ const ruleIds = foundRuleIds.flat();
33
+ const uniqueRuleIds = [...new Set(ruleIds)];
34
+ if (uniqueRuleIds.length > 0) {
35
+ await this.accessRulesStorage.deleteRules(uniqueRuleIds);
36
+ }
37
+ this.logger.info(() => ({
38
+ msg: "Endpoint deleted rule groups",
39
+ data: {
40
+ args,
41
+ uniqueRuleIds
42
+ }
43
+ }));
44
+ return {
45
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
46
+ data: {
47
+ deleted_count: uniqueRuleIds.length
48
+ }
49
+ };
50
+ }
51
+ }
52
+ exports.DeleteRuleGroupsEndpoint = DeleteRuleGroupsEndpoint;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const common = require("@prosopo/common");
5
+ const zod = require("zod");
6
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
7
+ class DeleteRulesEndpoint {
8
+ constructor(accessRulesStorage, logger) {
9
+ this.accessRulesStorage = accessRulesStorage;
10
+ this.logger = logger;
11
+ }
12
+ getRequestArgsSchema() {
13
+ return zod.z.array(ruleInput.accessRulesFilterInput);
14
+ }
15
+ async processRequest(args) {
16
+ let deletedCount = 0;
17
+ for (const rulesFilterInput of args) {
18
+ const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
19
+ await common.executeBatchesSequentially(ruleFilters, async (ruleFilter) => {
20
+ const ruleIds = await this.accessRulesStorage.findRuleIds(ruleFilter);
21
+ const uniqueRuleIds = [...new Set(ruleIds)];
22
+ if (uniqueRuleIds.length > 0) {
23
+ await this.accessRulesStorage.deleteRules(uniqueRuleIds);
24
+ deletedCount += uniqueRuleIds.length;
25
+ this.logger.info(() => ({
26
+ msg: "Endpoint deleted rules",
27
+ data: {
28
+ rulesFilterInput,
29
+ uniqueRuleIds
30
+ }
31
+ }));
32
+ }
33
+ });
34
+ }
35
+ return {
36
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
37
+ data: {
38
+ deleted_count: deletedCount
39
+ }
40
+ };
41
+ }
42
+ }
43
+ exports.DeleteRulesEndpoint = DeleteRulesEndpoint;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const zod = require("zod");
5
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
6
+ const fetchRulesResponse = zod.z.object({
7
+ ruleEntries: ruleInput.ruleEntryInput.array()
8
+ });
9
+ class FetchRulesEndpoint {
10
+ constructor(accessRulesStorage, logger) {
11
+ this.accessRulesStorage = accessRulesStorage;
12
+ this.logger = logger;
13
+ }
14
+ getRequestArgsSchema() {
15
+ return zod.z.object({
16
+ ids: zod.z.string().array()
17
+ });
18
+ }
19
+ async processRequest(args) {
20
+ const ruleEntries = await this.accessRulesStorage.fetchRules(args.ids);
21
+ this.logger.info(() => ({
22
+ msg: "Endpoint fetched rules",
23
+ data: {
24
+ requestedCount: args.ids.length,
25
+ foundCount: ruleEntries.length
26
+ }
27
+ }));
28
+ this.logger.debug(() => ({
29
+ msg: "Fetched rule details",
30
+ data: {
31
+ ruleEntries
32
+ }
33
+ }));
34
+ return {
35
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
36
+ data: {
37
+ ruleEntries
38
+ }
39
+ };
40
+ }
41
+ }
42
+ exports.FetchRulesEndpoint = FetchRulesEndpoint;
43
+ exports.fetchRulesResponse = fetchRulesResponse;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const common = require("@prosopo/common");
5
+ const zod = require("zod");
6
+ const ruleInput = require("../../ruleInput/ruleInput.cjs");
7
+ const ruleIdsResponse = zod.z.object({
8
+ ruleIds: zod.z.string().array()
9
+ });
10
+ class FindRuleIdsEndpoint {
11
+ constructor(accessRulesStorage, logger) {
12
+ this.accessRulesStorage = accessRulesStorage;
13
+ this.logger = logger;
14
+ }
15
+ getRequestArgsSchema() {
16
+ return zod.z.array(ruleInput.accessRulesFilterInput);
17
+ }
18
+ async processRequest(args) {
19
+ const ruleIdBatches = await common.executeBatchesSequentially(
20
+ args,
21
+ async (rulesFilterInput) => {
22
+ const ruleFilters = ruleInput.getAccessRuleFiltersFromInput(rulesFilterInput);
23
+ const ruleIds2 = await common.executeBatchesSequentially(
24
+ ruleFilters,
25
+ (ruleFilter) => this.accessRulesStorage.findRuleIds(ruleFilter)
26
+ );
27
+ return ruleIds2.flat();
28
+ }
29
+ );
30
+ const ruleIds = ruleIdBatches.flat();
31
+ const uniqueRuleIds = [...new Set(ruleIds)];
32
+ this.logger.info(() => ({
33
+ msg: "Endpoint found rules",
34
+ data: {
35
+ totalFoundCount: ruleIds.length,
36
+ uniqueFoundCount: uniqueRuleIds.length,
37
+ searchFilters: args,
38
+ foundIds: uniqueRuleIds
39
+ }
40
+ }));
41
+ return {
42
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
43
+ data: {
44
+ ruleIds: uniqueRuleIds
45
+ }
46
+ };
47
+ }
48
+ }
49
+ exports.FindRuleIdsEndpoint = FindRuleIdsEndpoint;
50
+ exports.ruleIdsResponse = ruleIdsResponse;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const apiRoute = require("@prosopo/api-route");
4
+ const zod = require("zod");
5
+ const missingIdsResponse = zod.z.object({
6
+ ids: zod.z.string().array()
7
+ });
8
+ class GetMissingIdsEndpoint {
9
+ constructor(accessRulesStorage, logger) {
10
+ this.accessRulesStorage = accessRulesStorage;
11
+ this.logger = logger;
12
+ }
13
+ getRequestArgsSchema() {
14
+ return zod.z.string().array();
15
+ }
16
+ async processRequest(args) {
17
+ const missingIds = await this.accessRulesStorage.getMissingRuleIds(args);
18
+ this.logger.info(() => ({
19
+ msg: "Endpoint checked missing ids",
20
+ data: {
21
+ idsToCheck: args.length,
22
+ missingIds: missingIds.length
23
+ }
24
+ }));
25
+ this.logger.debug(() => ({
26
+ msg: "Missing id details",
27
+ data: {
28
+ idsToCheck: args,
29
+ missingIds
30
+ }
31
+ }));
32
+ return {
33
+ status: apiRoute.ApiEndpointResponseStatus.SUCCESS,
34
+ data: {
35
+ ids: missingIds
36
+ }
37
+ };
38
+ }
39
+ }
40
+ exports.GetMissingIdsEndpoint = GetMissingIdsEndpoint;
41
+ exports.missingIdsResponse = missingIdsResponse;
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const fetchRules = require("./read/fetchRules.cjs");
4
+ const findRuleIds = require("./read/findRuleIds.cjs");
5
+ const getMissingIds = require("./read/getMissingIds.cjs");
6
+ const rehashRules = require("./write/rehashRules.cjs");
7
+ const deleteAllRules = require("./delete/deleteAllRules.cjs");
8
+ const deleteRuleGroups = require("./delete/deleteRuleGroups.cjs");
9
+ const deleteRules = require("./delete/deleteRules.cjs");
10
+ const insertRules = require("./write/insertRules.cjs");
11
+ var accessRuleApiPaths = /* @__PURE__ */ ((accessRuleApiPaths2) => {
12
+ accessRuleApiPaths2["DELETE_ALL"] = "/v1/prosopo/user-access-policy/rules/delete-all";
13
+ accessRuleApiPaths2["DELETE_GROUPS"] = "/v1/prosopo/user-access-policy/rules/delete-groups";
14
+ accessRuleApiPaths2["DELETE_MANY"] = "/v1/prosopo/user-access-policy/rules/delete-many";
15
+ accessRuleApiPaths2["FETCH_MANY"] = "/v1/prosopo/user-access-policy/rules/fetch-many";
16
+ accessRuleApiPaths2["FIND_IDS"] = "/v1/prosopo/user-access-policy/rules/find-ids";
17
+ accessRuleApiPaths2["GET_MISSING_IDS"] = "/v1/prosopo/user-access-policy/rules/get-missing-ids";
18
+ accessRuleApiPaths2["INSERT_MANY"] = "/v1/prosopo/user-access-policy/rules/insert-many";
19
+ accessRuleApiPaths2["REHASH_ALL"] = "/v1/prosopo/user-access-policy/rules/rehash-all";
20
+ return accessRuleApiPaths2;
21
+ })(accessRuleApiPaths || {});
22
+ class AccessRuleApiRoutes {
23
+ constructor(accessRulesStorage, logger) {
24
+ this.accessRulesStorage = accessRulesStorage;
25
+ this.logger = logger;
26
+ }
27
+ getRoutes() {
28
+ return {
29
+ ...this.makeDeleteEndpoints(),
30
+ ...this.makeReadEndpoints(),
31
+ ...this.makeWriteEndpoints()
32
+ };
33
+ }
34
+ makeDeleteEndpoints() {
35
+ return {
36
+ [
37
+ "/v1/prosopo/user-access-policy/rules/delete-all"
38
+ /* DELETE_ALL */
39
+ ]: new deleteAllRules.DeleteAllRulesEndpoint(
40
+ this.accessRulesStorage,
41
+ this.logger
42
+ ),
43
+ [
44
+ "/v1/prosopo/user-access-policy/rules/delete-groups"
45
+ /* DELETE_GROUPS */
46
+ ]: new deleteRuleGroups.DeleteRuleGroupsEndpoint(
47
+ this.accessRulesStorage,
48
+ this.logger
49
+ ),
50
+ [
51
+ "/v1/prosopo/user-access-policy/rules/delete-many"
52
+ /* DELETE_MANY */
53
+ ]: new deleteRules.DeleteRulesEndpoint(
54
+ this.accessRulesStorage,
55
+ this.logger
56
+ )
57
+ };
58
+ }
59
+ makeReadEndpoints() {
60
+ return {
61
+ [
62
+ "/v1/prosopo/user-access-policy/rules/fetch-many"
63
+ /* FETCH_MANY */
64
+ ]: new fetchRules.FetchRulesEndpoint(
65
+ this.accessRulesStorage,
66
+ this.logger
67
+ ),
68
+ [
69
+ "/v1/prosopo/user-access-policy/rules/find-ids"
70
+ /* FIND_IDS */
71
+ ]: new findRuleIds.FindRuleIdsEndpoint(
72
+ this.accessRulesStorage,
73
+ this.logger
74
+ ),
75
+ [
76
+ "/v1/prosopo/user-access-policy/rules/get-missing-ids"
77
+ /* GET_MISSING_IDS */
78
+ ]: new getMissingIds.GetMissingIdsEndpoint(
79
+ this.accessRulesStorage,
80
+ this.logger
81
+ )
82
+ };
83
+ }
84
+ makeWriteEndpoints() {
85
+ return {
86
+ [
87
+ "/v1/prosopo/user-access-policy/rules/insert-many"
88
+ /* INSERT_MANY */
89
+ ]: new insertRules.InsertRulesEndpoint(
90
+ this.accessRulesStorage,
91
+ this.logger
92
+ ),
93
+ [
94
+ "/v1/prosopo/user-access-policy/rules/rehash-all"
95
+ /* REHASH_ALL */
96
+ ]: new rehashRules.RehashRulesEndpoint(
97
+ this.accessRulesStorage,
98
+ this.logger
99
+ )
100
+ };
101
+ }
102
+ }
103
+ const getExpressApiRuleRateLimits = () => {
104
+ const defaults = {
105
+ limit: 5,
106
+ windowSeconds: 10
107
+ };
108
+ const defaultWindowMs = defaults.windowSeconds * 1e3;
109
+ const rateLimitEntries = Object.entries(accessRuleApiPaths).map(
110
+ ([endpointName, endpointPath]) => [
111
+ endpointPath,
112
+ {
113
+ windowMs: getIntEnvironmentVariable(
114
+ `PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_WINDOW`
115
+ ) || defaultWindowMs,
116
+ limit: getIntEnvironmentVariable(
117
+ `PROSOPO_USER_ACCESS_POLICY_RULE_${endpointName}_LIMIT`
118
+ ) || defaults.limit
119
+ }
120
+ ]
121
+ );
122
+ return Object.fromEntries(rateLimitEntries);
123
+ };
124
+ const getIntEnvironmentVariable = (variableName) => {
125
+ const variableValue = process.env[variableName];
126
+ const numericValue = variableValue ? Number.parseInt(variableValue) : Number.NaN;
127
+ return Number.isInteger(numericValue) ? numericValue : void 0;
128
+ };
129
+ exports.AccessRuleApiRoutes = AccessRuleApiRoutes;
130
+ exports.accessRuleApiPaths = accessRuleApiPaths;
131
+ exports.getExpressApiRuleRateLimits = getExpressApiRuleRateLimits;
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const api = require("@prosopo/api");
4
+ const fetchRules = require("./read/fetchRules.cjs");
5
+ const findRuleIds = require("./read/findRuleIds.cjs");
6
+ const getMissingIds = require("./read/getMissingIds.cjs");
7
+ const ruleApiRoutes = require("./ruleApiRoutes.cjs");
8
+ class AccessRulesApiClient extends api.ApiClient {
9
+ //// delete
10
+ deleteMany(filters, timestamp, signature) {
11
+ return this.post(
12
+ ruleApiRoutes.accessRuleApiPaths.DELETE_MANY,
13
+ filters,
14
+ this.getAuthHeaders(timestamp, signature)
15
+ );
16
+ }
17
+ deleteGroups(siteGroups, timestamp, signature) {
18
+ return this.post(
19
+ ruleApiRoutes.accessRuleApiPaths.DELETE_GROUPS,
20
+ siteGroups,
21
+ this.getAuthHeaders(timestamp, signature)
22
+ );
23
+ }
24
+ deleteAll(timestamp, signature) {
25
+ return this.post(
26
+ ruleApiRoutes.accessRuleApiPaths.DELETE_ALL,
27
+ {},
28
+ this.getAuthHeaders(timestamp, signature)
29
+ );
30
+ }
31
+ //// read
32
+ async getMissingIds(idsToCheck, timestamp, signature) {
33
+ const endpointResponse = await this.post(
34
+ ruleApiRoutes.accessRuleApiPaths.GET_MISSING_IDS,
35
+ idsToCheck,
36
+ this.getAuthHeaders(timestamp, signature)
37
+ );
38
+ const parsedData = getMissingIds.missingIdsResponse.safeParse(endpointResponse.data);
39
+ return {
40
+ ...endpointResponse,
41
+ data: parsedData.success ? parsedData.data : void 0
42
+ };
43
+ }
44
+ async fetchMany(fetchOptions, timestamp, signature) {
45
+ const endpointResponse = await this.post(
46
+ ruleApiRoutes.accessRuleApiPaths.FETCH_MANY,
47
+ fetchOptions,
48
+ this.getAuthHeaders(timestamp, signature)
49
+ );
50
+ const parsedData = fetchRules.fetchRulesResponse.safeParse(endpointResponse.data);
51
+ return {
52
+ ...endpointResponse,
53
+ data: parsedData.success ? parsedData.data : void 0
54
+ };
55
+ }
56
+ async findIds(filters, timestamp, signature) {
57
+ const endpointResponse = await this.post(
58
+ ruleApiRoutes.accessRuleApiPaths.FIND_IDS,
59
+ filters,
60
+ this.getAuthHeaders(timestamp, signature)
61
+ );
62
+ const parsedData = findRuleIds.ruleIdsResponse.safeParse(endpointResponse.data);
63
+ return {
64
+ ...endpointResponse,
65
+ data: parsedData.success ? parsedData.data : void 0
66
+ };
67
+ }
68
+ //// write
69
+ async rehashAll(timestamp, signature) {
70
+ return this.post(
71
+ ruleApiRoutes.accessRuleApiPaths.REHASH_ALL,
72
+ {},
73
+ this.getAuthHeaders(timestamp, signature)
74
+ );
75
+ }
76
+ insertMany(ruleGroups, timestamp, signature) {
77
+ return this.post(
78
+ ruleApiRoutes.accessRuleApiPaths.INSERT_MANY,
79
+ ruleGroups,
80
+ this.getAuthHeaders(timestamp, signature)
81
+ );
82
+ }
83
+ getAuthHeaders(timestamp, signature) {
84
+ return {
85
+ headers: {
86
+ "Prosopo-Site-Key": this.account,
87
+ timestamp,
88
+ signature
89
+ }
90
+ };
91
+ }
92
+ }
93
+ exports.AccessRulesApiClient = AccessRulesApiClient;