@zakyyudha/node-authzkit 1.0.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 (120) hide show
  1. package/.eslintrc.cjs +17 -0
  2. package/.prettierrc.json +10 -0
  3. package/.release-it.json +24 -0
  4. package/README.md +221 -0
  5. package/dist/src/classes/Authzkit.d.ts +110 -0
  6. package/dist/src/classes/Authzkit.js +189 -0
  7. package/dist/src/classes/Authzkit.js.map +1 -0
  8. package/dist/src/dashboard/router.d.ts +19 -0
  9. package/dist/src/dashboard/router.js +89 -0
  10. package/dist/src/dashboard/router.js.map +1 -0
  11. package/dist/src/dashboard/routes/permissions.d.ts +3 -0
  12. package/dist/src/dashboard/routes/permissions.js +39 -0
  13. package/dist/src/dashboard/routes/permissions.js.map +1 -0
  14. package/dist/src/dashboard/routes/roles.d.ts +3 -0
  15. package/dist/src/dashboard/routes/roles.js +39 -0
  16. package/dist/src/dashboard/routes/roles.js.map +1 -0
  17. package/dist/src/dashboard/routes/users.d.ts +3 -0
  18. package/dist/src/dashboard/routes/users.js +81 -0
  19. package/dist/src/dashboard/routes/users.js.map +1 -0
  20. package/dist/src/drivers/mongodb/mongo-connection.d.ts +15 -0
  21. package/dist/src/drivers/mongodb/mongo-connection.js +89 -0
  22. package/dist/src/drivers/mongodb/mongo-connection.js.map +1 -0
  23. package/dist/src/drivers/postgres/pg-connection.d.ts +17 -0
  24. package/dist/src/drivers/postgres/pg-connection.js +145 -0
  25. package/dist/src/drivers/postgres/pg-connection.js.map +1 -0
  26. package/dist/src/index.d.ts +19 -0
  27. package/dist/src/index.js +36 -0
  28. package/dist/src/index.js.map +1 -0
  29. package/dist/src/interfaces/Authorizable.d.ts +7 -0
  30. package/dist/src/interfaces/Authorizable.js +3 -0
  31. package/dist/src/interfaces/Authorizable.js.map +1 -0
  32. package/dist/src/interfaces/IAuthzkitConfig.d.ts +18 -0
  33. package/dist/src/interfaces/IAuthzkitConfig.js +3 -0
  34. package/dist/src/interfaces/IAuthzkitConfig.js.map +1 -0
  35. package/dist/src/interfaces/Permission.d.ts +4 -0
  36. package/dist/src/interfaces/Permission.js +3 -0
  37. package/dist/src/interfaces/Permission.js.map +1 -0
  38. package/dist/src/interfaces/Role.d.ts +5 -0
  39. package/dist/src/interfaces/Role.js +3 -0
  40. package/dist/src/interfaces/Role.js.map +1 -0
  41. package/dist/src/middleware/authzMiddleware.d.ts +17 -0
  42. package/dist/src/middleware/authzMiddleware.js +52 -0
  43. package/dist/src/middleware/authzMiddleware.js.map +1 -0
  44. package/dist/src/stores/IAuthzkitStore.d.ts +23 -0
  45. package/dist/src/stores/IAuthzkitStore.js +3 -0
  46. package/dist/src/stores/IAuthzkitStore.js.map +1 -0
  47. package/dist/src/stores/InMemoryAuthzkitStore.d.ts +28 -0
  48. package/dist/src/stores/InMemoryAuthzkitStore.js +83 -0
  49. package/dist/src/stores/InMemoryAuthzkitStore.js.map +1 -0
  50. package/dist/src/stores/MongoAuthzkitStore.d.ts +31 -0
  51. package/dist/src/stores/MongoAuthzkitStore.js +127 -0
  52. package/dist/src/stores/MongoAuthzkitStore.js.map +1 -0
  53. package/dist/src/stores/PgAuthzkitStore.d.ts +31 -0
  54. package/dist/src/stores/PgAuthzkitStore.js +133 -0
  55. package/dist/src/stores/PgAuthzkitStore.js.map +1 -0
  56. package/dist/src/utils/envConfig.d.ts +2 -0
  57. package/dist/src/utils/envConfig.js +68 -0
  58. package/dist/src/utils/envConfig.js.map +1 -0
  59. package/dist/tests/Authzkit.test.d.ts +1 -0
  60. package/dist/tests/Authzkit.test.js +126 -0
  61. package/dist/tests/Authzkit.test.js.map +1 -0
  62. package/dist/tests/MongoAuthzkitStore.test.d.ts +1 -0
  63. package/dist/tests/MongoAuthzkitStore.test.js +161 -0
  64. package/dist/tests/MongoAuthzkitStore.test.js.map +1 -0
  65. package/dist/tests/MongoAuthzkitStoreCustom.test.d.ts +1 -0
  66. package/dist/tests/MongoAuthzkitStoreCustom.test.js +65 -0
  67. package/dist/tests/MongoAuthzkitStoreCustom.test.js.map +1 -0
  68. package/dist/tests/PgAuthzkitStore.test.d.ts +1 -0
  69. package/dist/tests/PgAuthzkitStore.test.js +163 -0
  70. package/dist/tests/PgAuthzkitStore.test.js.map +1 -0
  71. package/dist/tests/PgAuthzkitStoreCustom.test.d.ts +1 -0
  72. package/dist/tests/PgAuthzkitStoreCustom.test.js +74 -0
  73. package/dist/tests/PgAuthzkitStoreCustom.test.js.map +1 -0
  74. package/examples/express-app.ts +65 -0
  75. package/jest.config.js +9 -0
  76. package/package.json +57 -0
  77. package/src/classes/Authzkit.ts +214 -0
  78. package/src/dashboard/router.ts +79 -0
  79. package/src/dashboard/routes/permissions.ts +38 -0
  80. package/src/dashboard/routes/roles.ts +38 -0
  81. package/src/dashboard/routes/users.ts +81 -0
  82. package/src/dashboard/web/README.md +73 -0
  83. package/src/dashboard/web/eslint.config.js +23 -0
  84. package/src/dashboard/web/index.html +13 -0
  85. package/src/dashboard/web/package.json +31 -0
  86. package/src/dashboard/web/pnpm-lock.yaml +2094 -0
  87. package/src/dashboard/web/public/vite.svg +1 -0
  88. package/src/dashboard/web/src/App.css +42 -0
  89. package/src/dashboard/web/src/App.tsx +26 -0
  90. package/src/dashboard/web/src/assets/react.svg +1 -0
  91. package/src/dashboard/web/src/components/Navbar.tsx +53 -0
  92. package/src/dashboard/web/src/index.css +138 -0
  93. package/src/dashboard/web/src/main.tsx +10 -0
  94. package/src/dashboard/web/src/pages/PermissionsPage.tsx +87 -0
  95. package/src/dashboard/web/src/pages/RolesPage.tsx +98 -0
  96. package/src/dashboard/web/src/pages/UsersPage.tsx +146 -0
  97. package/src/dashboard/web/src/services/api.ts +59 -0
  98. package/src/dashboard/web/tsconfig.app.json +28 -0
  99. package/src/dashboard/web/tsconfig.json +7 -0
  100. package/src/dashboard/web/tsconfig.node.json +26 -0
  101. package/src/dashboard/web/vite.config.ts +8 -0
  102. package/src/drivers/mongodb/mongo-connection.ts +98 -0
  103. package/src/drivers/postgres/pg-connection.ts +159 -0
  104. package/src/index.ts +19 -0
  105. package/src/interfaces/Authorizable.ts +8 -0
  106. package/src/interfaces/IAuthzkitConfig.ts +19 -0
  107. package/src/interfaces/Permission.ts +4 -0
  108. package/src/interfaces/Role.ts +5 -0
  109. package/src/middleware/authzMiddleware.ts +60 -0
  110. package/src/stores/IAuthzkitStore.ts +33 -0
  111. package/src/stores/InMemoryAuthzkitStore.ts +101 -0
  112. package/src/stores/MongoAuthzkitStore.ts +171 -0
  113. package/src/stores/PgAuthzkitStore.ts +191 -0
  114. package/src/utils/envConfig.ts +70 -0
  115. package/tests/Authzkit.test.ts +157 -0
  116. package/tests/MongoAuthzkitStore.test.ts +204 -0
  117. package/tests/MongoAuthzkitStoreCustom.test.ts +75 -0
  118. package/tests/PgAuthzkitStore.test.ts +207 -0
  119. package/tests/PgAuthzkitStoreCustom.test.ts +90 -0
  120. package/tsconfig.json +37 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Authorizable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Authorizable.js","sourceRoot":"","sources":["../../../src/interfaces/Authorizable.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ export interface IAuthzkitConfig {
2
+ connection: {
3
+ type: 'mongodb' | 'postgres' | 'memory';
4
+ uri?: string;
5
+ database?: string;
6
+ host?: string;
7
+ port?: number;
8
+ user?: string;
9
+ password?: string;
10
+ };
11
+ models?: {
12
+ users?: string;
13
+ roles?: string;
14
+ permissions?: string;
15
+ user_roles?: string;
16
+ user_permissions?: string;
17
+ };
18
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IAuthzkitConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAuthzkitConfig.js","sourceRoot":"","sources":["../../../src/interfaces/IAuthzkitConfig.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface Permission {
2
+ name: string;
3
+ guard_name?: string;
4
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Permission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Permission.js","sourceRoot":"","sources":["../../../src/interfaces/Permission.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ export interface Role {
2
+ name: string;
3
+ guard_name?: string;
4
+ permissions: string[];
5
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Role.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Role.js","sourceRoot":"","sources":["../../../src/interfaces/Role.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ import { Authorizable } from '../interfaces/Authorizable';
3
+ declare module 'express' {
4
+ interface Request {
5
+ user?: Authorizable;
6
+ }
7
+ }
8
+ /**
9
+ * Express middleware for role-based or permission-based authorization.
10
+ * Expects `req.user` to be an object conforming to `Authorizable` interface.
11
+ *
12
+ * @param requiredPermissionsAndRoles A single string or an array of strings representing
13
+ * the required roles or permissions.
14
+ * If multiple are provided, the user needs to have AT LEAST ONE of them.
15
+ * @returns An Express middleware function.
16
+ */
17
+ export declare const authorize: (requiredPermissionsAndRoles: string | string[]) => (req: Request, res: Response, next: NextFunction) => Promise<Response<any, Record<string, any>> | undefined>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authorize = void 0;
4
+ const Authzkit_1 = require("../classes/Authzkit");
5
+ /**
6
+ * Express middleware for role-based or permission-based authorization.
7
+ * Expects `req.user` to be an object conforming to `Authorizable` interface.
8
+ *
9
+ * @param requiredPermissionsAndRoles A single string or an array of strings representing
10
+ * the required roles or permissions.
11
+ * If multiple are provided, the user needs to have AT LEAST ONE of them.
12
+ * @returns An Express middleware function.
13
+ */
14
+ const authorize = (requiredPermissionsAndRoles) => {
15
+ return async (req, res, next) => {
16
+ try {
17
+ const authzkit = Authzkit_1.Authzkit.getInstance(); // Get the singleton instance
18
+ const user = req.user;
19
+ if (!user) {
20
+ return res.status(401).send('Authentication required.');
21
+ }
22
+ const requirements = Array.isArray(requiredPermissionsAndRoles)
23
+ ? requiredPermissionsAndRoles
24
+ : [requiredPermissionsAndRoles];
25
+ // Check if the user has at least one of the required roles or permissions
26
+ let hasAccess = false;
27
+ for (const requirement of requirements) {
28
+ // First, check if it's a role
29
+ if (await authzkit.hasRole(user, requirement)) {
30
+ hasAccess = true;
31
+ break;
32
+ }
33
+ // If not a role, check if it's a permission
34
+ if (await authzkit.hasPermission(user, requirement)) {
35
+ hasAccess = true;
36
+ break;
37
+ }
38
+ }
39
+ if (hasAccess) {
40
+ next();
41
+ }
42
+ else {
43
+ res.status(403).send('Forbidden: Insufficient permissions.');
44
+ }
45
+ }
46
+ catch (error) {
47
+ next(error);
48
+ }
49
+ };
50
+ };
51
+ exports.authorize = authorize;
52
+ //# sourceMappingURL=authzMiddleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authzMiddleware.js","sourceRoot":"","sources":["../../../src/middleware/authzMiddleware.ts"],"names":[],"mappings":";;;AACA,kDAA+C;AAU/C;;;;;;;;GAQG;AACI,MAAM,SAAS,GAAG,CAAC,2BAA8C,EAAE,EAAE;IAC1E,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC/D,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,mBAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,6BAA6B;YAEtE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;YAEtB,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,2BAA2B,CAAC;gBAC7D,CAAC,CAAC,2BAA2B;gBAC7B,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC;YAElC,0EAA0E;YAC1E,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;gBACvC,8BAA8B;gBAC9B,IAAI,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;oBAC9C,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;gBACD,4CAA4C;gBAC5C,IAAI,MAAM,QAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;oBACpD,SAAS,GAAG,IAAI,CAAC;oBACjB,MAAM;gBACR,CAAC;YACH,CAAC;YAED,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,EAAE,CAAC;YACT,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YAC/D,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC,CAAC;AAvCW,QAAA,SAAS,aAuCpB"}
@@ -0,0 +1,23 @@
1
+ import { Permission } from '../interfaces/Permission';
2
+ import { Role } from '../interfaces/Role';
3
+ export interface IAuthzkitStore {
4
+ getPermission(name: string): Promise<Permission | undefined>;
5
+ getPermissions(): Promise<Permission[]>;
6
+ setPermission(permission: Permission): Promise<void>;
7
+ hasPermission(name: string): Promise<boolean>;
8
+ deletePermission(name: string): Promise<void>;
9
+ getRole(name: string): Promise<Role | undefined>;
10
+ getRoles(): Promise<Role[]>;
11
+ setRole(role: Role): Promise<void>;
12
+ hasRole(name: string): Promise<boolean>;
13
+ deleteRole(name: string): Promise<void>;
14
+ getUserRoles(userId: string | number): Promise<Set<string>>;
15
+ addUserRole(userId: string | number, roleName: string): Promise<void>;
16
+ removeUserRole(userId: string | number, roleName: string): Promise<void>;
17
+ hasUserRole(userId: string | number, roleName: string): Promise<boolean>;
18
+ getUserPermissions(userId: string | number): Promise<Set<string>>;
19
+ addUserPermission(userId: string | number, permissionName: string): Promise<void>;
20
+ removeUserPermission(userId: string | number, permissionName: string): Promise<void>;
21
+ hasUserPermission(userId: string | number, permissionName: string): Promise<boolean>;
22
+ reset(): Promise<void>;
23
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=IAuthzkitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IAuthzkitStore.js","sourceRoot":"","sources":["../../../src/stores/IAuthzkitStore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,28 @@
1
+ import { IAuthzkitStore } from './IAuthzkitStore';
2
+ import { Permission } from '../interfaces/Permission';
3
+ import { Role } from '../interfaces/Role';
4
+ export declare class InMemoryAuthzkitStore implements IAuthzkitStore {
5
+ private permissions;
6
+ private roles;
7
+ private userRoles;
8
+ private userPermissions;
9
+ getPermission(name: string): Promise<Permission | undefined>;
10
+ getPermissions(): Promise<Permission[]>;
11
+ setPermission(permission: Permission): Promise<void>;
12
+ hasPermission(name: string): Promise<boolean>;
13
+ deletePermission(name: string): Promise<void>;
14
+ getRole(name: string): Promise<Role | undefined>;
15
+ getRoles(): Promise<Role[]>;
16
+ setRole(role: Role): Promise<void>;
17
+ hasRole(name: string): Promise<boolean>;
18
+ deleteRole(name: string): Promise<void>;
19
+ getUserRoles(userId: string | number): Promise<Set<string>>;
20
+ addUserRole(userId: string | number, roleName: string): Promise<void>;
21
+ removeUserRole(userId: string | number, roleName: string): Promise<void>;
22
+ hasUserRole(userId: string | number, roleName: string): Promise<boolean>;
23
+ getUserPermissions(userId: string | number): Promise<Set<string>>;
24
+ addUserPermission(userId: string | number, permissionName: string): Promise<void>;
25
+ removeUserPermission(userId: string | number, permissionName: string): Promise<void>;
26
+ hasUserPermission(userId: string | number, permissionName: string): Promise<boolean>;
27
+ reset(): Promise<void>;
28
+ }
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryAuthzkitStore = void 0;
4
+ class InMemoryAuthzkitStore {
5
+ permissions = new Map();
6
+ roles = new Map();
7
+ userRoles = new Map();
8
+ userPermissions = new Map();
9
+ async getPermission(name) {
10
+ return this.permissions.get(name);
11
+ }
12
+ async getPermissions() {
13
+ return Array.from(this.permissions.values());
14
+ }
15
+ async setPermission(permission) {
16
+ this.permissions.set(permission.name, permission);
17
+ }
18
+ async hasPermission(name) {
19
+ return this.permissions.has(name);
20
+ }
21
+ async deletePermission(name) {
22
+ this.permissions.delete(name);
23
+ }
24
+ async getRole(name) {
25
+ return this.roles.get(name);
26
+ }
27
+ async getRoles() {
28
+ return Array.from(this.roles.values());
29
+ }
30
+ async setRole(role) {
31
+ this.roles.set(role.name, role);
32
+ }
33
+ async hasRole(name) {
34
+ return this.roles.has(name);
35
+ }
36
+ async deleteRole(name) {
37
+ this.roles.delete(name);
38
+ }
39
+ async getUserRoles(userId) {
40
+ if (!this.userRoles.has(userId)) {
41
+ this.userRoles.set(userId, new Set());
42
+ }
43
+ return this.userRoles.get(userId);
44
+ }
45
+ async addUserRole(userId, roleName) {
46
+ (await this.getUserRoles(userId)).add(roleName);
47
+ }
48
+ async removeUserRole(userId, roleName) {
49
+ (await this.getUserRoles(userId)).delete(roleName);
50
+ if ((await this.getUserRoles(userId)).size === 0) {
51
+ this.userRoles.delete(userId);
52
+ }
53
+ }
54
+ async hasUserRole(userId, roleName) {
55
+ return (await this.getUserRoles(userId)).has(roleName);
56
+ }
57
+ async getUserPermissions(userId) {
58
+ if (!this.userPermissions.has(userId)) {
59
+ this.userPermissions.set(userId, new Set());
60
+ }
61
+ return this.userPermissions.get(userId);
62
+ }
63
+ async addUserPermission(userId, permissionName) {
64
+ (await this.getUserPermissions(userId)).add(permissionName);
65
+ }
66
+ async removeUserPermission(userId, permissionName) {
67
+ (await this.getUserPermissions(userId)).delete(permissionName);
68
+ if ((await this.getUserPermissions(userId)).size === 0) {
69
+ this.userPermissions.delete(userId);
70
+ }
71
+ }
72
+ async hasUserPermission(userId, permissionName) {
73
+ return (await this.getUserPermissions(userId)).has(permissionName);
74
+ }
75
+ async reset() {
76
+ this.permissions.clear();
77
+ this.roles.clear();
78
+ this.userRoles.clear();
79
+ this.userPermissions.clear();
80
+ }
81
+ }
82
+ exports.InMemoryAuthzkitStore = InMemoryAuthzkitStore;
83
+ //# sourceMappingURL=InMemoryAuthzkitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemoryAuthzkitStore.js","sourceRoot":"","sources":["../../../src/stores/InMemoryAuthzkitStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { IAuthzkitStore } from './IAuthzkitStore';
2
+ import { Permission } from '../interfaces/Permission';
3
+ import { Role } from '../interfaces/Role';
4
+ import { MongoConnection } from '../drivers/mongodb/mongo-connection';
5
+ export declare class MongoAuthzkitStore implements IAuthzkitStore {
6
+ private db;
7
+ private permissionsCollection;
8
+ private rolesCollection;
9
+ private userRolesCollection;
10
+ private userPermissionsCollection;
11
+ constructor(mongoConnection: MongoConnection);
12
+ getPermission(name: string): Promise<Permission | undefined>;
13
+ getPermissions(): Promise<Permission[]>;
14
+ setPermission(permission: Permission): Promise<void>;
15
+ hasPermission(name: string): Promise<boolean>;
16
+ deletePermission(name: string): Promise<void>;
17
+ getRole(name: string): Promise<Role | undefined>;
18
+ getRoles(): Promise<Role[]>;
19
+ setRole(role: Role): Promise<void>;
20
+ hasRole(name: string): Promise<boolean>;
21
+ deleteRole(name: string): Promise<void>;
22
+ getUserRoles(userId: string | number): Promise<Set<string>>;
23
+ addUserRole(userId: string | number, roleName: string): Promise<void>;
24
+ removeUserRole(userId: string | number, roleName: string): Promise<void>;
25
+ hasUserRole(userId: string | number, roleName: string): Promise<boolean>;
26
+ getUserPermissions(userId: string | number): Promise<Set<string>>;
27
+ addUserPermission(userId: string | number, permissionName: string): Promise<void>;
28
+ removeUserPermission(userId: string | number, permissionName: string): Promise<void>;
29
+ hasUserPermission(userId: string | number, permissionName: string): Promise<boolean>;
30
+ reset(): Promise<void>;
31
+ }
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoAuthzkitStore = void 0;
4
+ class MongoAuthzkitStore {
5
+ db;
6
+ permissionsCollection;
7
+ rolesCollection;
8
+ userRolesCollection;
9
+ userPermissionsCollection;
10
+ constructor(mongoConnection) {
11
+ this.db = mongoConnection.getDb();
12
+ this.permissionsCollection = this.db.collection(mongoConnection.getCollectionName('permissions'));
13
+ this.rolesCollection = this.db.collection(mongoConnection.getCollectionName('roles'));
14
+ this.userRolesCollection = this.db.collection(mongoConnection.getCollectionName('user_roles'));
15
+ this.userPermissionsCollection = this.db.collection(mongoConnection.getCollectionName('user_permissions'));
16
+ // Ensure unique indexes
17
+ void this.permissionsCollection.createIndex({ name: 1 }, { unique: true }).catch(console.error);
18
+ void this.rolesCollection.createIndex({ name: 1 }, { unique: true }).catch(console.error);
19
+ void this.userRolesCollection
20
+ .createIndex({ userId: 1, roleName: 1 }, { unique: true })
21
+ .catch(console.error);
22
+ void this.userPermissionsCollection
23
+ .createIndex({ userId: 1, permissionName: 1 }, { unique: true })
24
+ .catch(console.error);
25
+ }
26
+ async getPermission(name) {
27
+ const perm = await this.permissionsCollection.findOne({ name });
28
+ return perm ? { name: perm.name, guard_name: perm.guard_name } : undefined;
29
+ }
30
+ async getPermissions() {
31
+ const perms = await this.permissionsCollection.find({}).toArray();
32
+ return perms.map((perm) => ({ name: perm.name, guard_name: perm.guard_name }));
33
+ }
34
+ async setPermission(permission) {
35
+ await this.permissionsCollection.updateOne({ name: permission.name }, { $set: permission }, { upsert: true });
36
+ }
37
+ async hasPermission(name) {
38
+ const count = await this.permissionsCollection.countDocuments({ name });
39
+ return count > 0;
40
+ }
41
+ async deletePermission(name) {
42
+ await this.permissionsCollection.deleteOne({ name });
43
+ }
44
+ async getRole(name) {
45
+ const role = await this.rolesCollection.findOne({ name });
46
+ return role
47
+ ? { name: role.name, guard_name: role.guard_name, permissions: role.permissions }
48
+ : undefined;
49
+ }
50
+ async getRoles() {
51
+ const roles = await this.rolesCollection.find({}).toArray();
52
+ return roles.map((role) => ({
53
+ name: role.name,
54
+ guard_name: role.guard_name,
55
+ permissions: role.permissions,
56
+ }));
57
+ }
58
+ async setRole(role) {
59
+ await this.rolesCollection.updateOne({ name: role.name }, { $set: { name: role.name, guard_name: role.guard_name, permissions: role.permissions } }, { upsert: true });
60
+ }
61
+ async hasRole(name) {
62
+ const count = await this.rolesCollection.countDocuments({ name });
63
+ return count > 0;
64
+ }
65
+ async deleteRole(name) {
66
+ await this.rolesCollection.deleteOne({ name });
67
+ await this.userRolesCollection.deleteMany({ roleName: name }); // Remove all assignments for this role
68
+ }
69
+ async getUserRoles(userId) {
70
+ const userRoles = await this.userRolesCollection.find({ userId }).toArray();
71
+ return new Set(userRoles.map((ur) => ur.roleName));
72
+ }
73
+ async addUserRole(userId, roleName) {
74
+ try {
75
+ await this.userRolesCollection.insertOne({ userId, roleName });
76
+ }
77
+ catch (error) {
78
+ if (error.code === 11000) {
79
+ // Duplicate key error
80
+ // Role already assigned, ignore
81
+ }
82
+ else {
83
+ throw error;
84
+ }
85
+ }
86
+ }
87
+ async removeUserRole(userId, roleName) {
88
+ await this.userRolesCollection.deleteOne({ userId, roleName });
89
+ }
90
+ async hasUserRole(userId, roleName) {
91
+ const count = await this.userRolesCollection.countDocuments({ userId, roleName });
92
+ return count > 0;
93
+ }
94
+ async getUserPermissions(userId) {
95
+ const userPermissions = await this.userPermissionsCollection.find({ userId }).toArray();
96
+ return new Set(userPermissions.map((up) => up.permissionName));
97
+ }
98
+ async addUserPermission(userId, permissionName) {
99
+ try {
100
+ await this.userPermissionsCollection.insertOne({ userId, permissionName });
101
+ }
102
+ catch (error) {
103
+ if (error.code === 11000) {
104
+ // Duplicate key error
105
+ // Permission already assigned, ignore
106
+ }
107
+ else {
108
+ throw error;
109
+ }
110
+ }
111
+ }
112
+ async removeUserPermission(userId, permissionName) {
113
+ await this.userPermissionsCollection.deleteOne({ userId, permissionName });
114
+ }
115
+ async hasUserPermission(userId, permissionName) {
116
+ const count = await this.userPermissionsCollection.countDocuments({ userId, permissionName });
117
+ return count > 0;
118
+ }
119
+ async reset() {
120
+ await this.permissionsCollection.deleteMany({});
121
+ await this.rolesCollection.deleteMany({});
122
+ await this.userRolesCollection.deleteMany({});
123
+ await this.userPermissionsCollection.deleteMany({});
124
+ }
125
+ }
126
+ exports.MongoAuthzkitStore = MongoAuthzkitStore;
127
+ //# sourceMappingURL=MongoAuthzkitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MongoAuthzkitStore.js","sourceRoot":"","sources":["../../../src/stores/MongoAuthzkitStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { IAuthzkitStore } from './IAuthzkitStore';
2
+ import { Permission } from '../interfaces/Permission';
3
+ import { Role } from '../interfaces/Role';
4
+ import { PgConnection } from '../drivers/postgres/pg-connection';
5
+ export declare class PgAuthzkitStore implements IAuthzkitStore {
6
+ private pgConnection;
7
+ private permissionsTable;
8
+ private rolesTable;
9
+ private userRolesTable;
10
+ private userPermissionsTable;
11
+ constructor(pgConnection: PgConnection);
12
+ getPermission(name: string): Promise<Permission | undefined>;
13
+ getPermissions(): Promise<Permission[]>;
14
+ setPermission(permission: Permission): Promise<void>;
15
+ hasPermission(name: string): Promise<boolean>;
16
+ deletePermission(name: string): Promise<void>;
17
+ getRole(name: string): Promise<Role | undefined>;
18
+ getRoles(): Promise<Role[]>;
19
+ setRole(role: Role): Promise<void>;
20
+ hasRole(name: string): Promise<boolean>;
21
+ deleteRole(name: string): Promise<void>;
22
+ getUserRoles(userId: string | number): Promise<Set<string>>;
23
+ addUserRole(userId: string | number, roleName: string): Promise<void>;
24
+ removeUserRole(userId: string | number, roleName: string): Promise<void>;
25
+ hasUserRole(userId: string | number, roleName: string): Promise<boolean>;
26
+ getUserPermissions(userId: string | number): Promise<Set<string>>;
27
+ addUserPermission(userId: string | number, permissionName: string): Promise<void>;
28
+ removeUserPermission(userId: string | number, permissionName: string): Promise<void>;
29
+ hasUserPermission(userId: string | number, permissionName: string): Promise<boolean>;
30
+ reset(): Promise<void>;
31
+ }
@@ -0,0 +1,133 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PgAuthzkitStore = void 0;
4
+ class PgAuthzkitStore {
5
+ pgConnection;
6
+ permissionsTable;
7
+ rolesTable;
8
+ userRolesTable;
9
+ userPermissionsTable;
10
+ constructor(pgConnection) {
11
+ this.pgConnection = pgConnection;
12
+ this.permissionsTable = this.pgConnection.getTableName('permissions');
13
+ this.rolesTable = this.pgConnection.getTableName('roles');
14
+ this.userRolesTable = this.pgConnection.getTableName('user_roles');
15
+ this.userPermissionsTable = this.pgConnection.getTableName('user_permissions');
16
+ }
17
+ async getPermission(name) {
18
+ const res = await this.pgConnection.query(`SELECT name, guard_name FROM ${this.permissionsTable} WHERE name = $1`, [name]);
19
+ if (res.rows.length > 0) {
20
+ return res.rows[0];
21
+ }
22
+ return undefined;
23
+ }
24
+ async getPermissions() {
25
+ const res = await this.pgConnection.query(`SELECT name, guard_name FROM ${this.permissionsTable}`);
26
+ return res.rows.map((row) => ({ name: row.name, guard_name: row.guard_name }));
27
+ }
28
+ async setPermission(permission) {
29
+ await this.pgConnection.query(`INSERT INTO ${this.permissionsTable} (name, guard_name) VALUES ($1, $2) ON CONFLICT (name) DO UPDATE SET guard_name = $2`, [permission.name, permission.guard_name]);
30
+ }
31
+ async hasPermission(name) {
32
+ const res = await this.pgConnection.query(`SELECT 1 FROM ${this.permissionsTable} WHERE name = $1`, [name]);
33
+ return res.rows.length > 0;
34
+ }
35
+ async deletePermission(name) {
36
+ await this.pgConnection.query(`DELETE FROM ${this.permissionsTable} WHERE name = $1`, [name]);
37
+ }
38
+ async getRole(name) {
39
+ const res = await this.pgConnection.query(`SELECT name, guard_name, permissions FROM ${this.rolesTable} WHERE name = $1`, [name]);
40
+ if (res.rows.length > 0) {
41
+ // Ensure permissions are correctly deserialized if stored as string array
42
+ const roleData = res.rows[0];
43
+ return {
44
+ name: roleData.name,
45
+ guard_name: roleData.guard_name,
46
+ permissions: Array.isArray(roleData.permissions) ? roleData.permissions : [],
47
+ };
48
+ }
49
+ return undefined;
50
+ }
51
+ async getRoles() {
52
+ const res = await this.pgConnection.query(`SELECT name, guard_name, permissions FROM ${this.rolesTable}`);
53
+ return res.rows.map((roleData) => ({
54
+ name: roleData.name,
55
+ guard_name: roleData.guard_name,
56
+ permissions: Array.isArray(roleData.permissions) ? roleData.permissions : [],
57
+ }));
58
+ }
59
+ async setRole(role) {
60
+ await this.pgConnection.query(`INSERT INTO ${this.rolesTable} (name, guard_name, permissions) VALUES ($1, $2, $3) ON CONFLICT (name) DO UPDATE SET guard_name = $2, permissions = $3`, [role.name, role.guard_name, role.permissions]);
61
+ }
62
+ async hasRole(name) {
63
+ const res = await this.pgConnection.query(`SELECT 1 FROM ${this.rolesTable} WHERE name = $1`, [
64
+ name,
65
+ ]);
66
+ return res.rows.length > 0;
67
+ }
68
+ async deleteRole(name) {
69
+ await this.pgConnection.query(`DELETE FROM ${this.rolesTable} WHERE name = $1`, [name]);
70
+ // CASCADE DELETE should handle user_roles table if set up correctly via foreign keys
71
+ }
72
+ async getUserRoles(userId) {
73
+ const res = await this.pgConnection.query(`SELECT role_name FROM ${this.userRolesTable} WHERE user_id = $1`, [userId.toString()]);
74
+ return new Set(res.rows.map((row) => row.role_name));
75
+ }
76
+ async addUserRole(userId, roleName) {
77
+ try {
78
+ await this.pgConnection.query(`INSERT INTO ${this.userRolesTable} (user_id, role_name) VALUES ($1, $2)`, [userId.toString(), roleName]);
79
+ }
80
+ catch (error) {
81
+ if (error.code === '23505') {
82
+ // Unique violation error
83
+ // Role already assigned, ignore
84
+ }
85
+ else {
86
+ throw error;
87
+ }
88
+ }
89
+ }
90
+ async removeUserRole(userId, roleName) {
91
+ await this.pgConnection.query(`DELETE FROM ${this.userRolesTable} WHERE user_id = $1 AND role_name = $2`, [userId.toString(), roleName]);
92
+ }
93
+ async hasUserRole(userId, roleName) {
94
+ const res = await this.pgConnection.query(`SELECT 1 FROM ${this.userRolesTable} WHERE user_id = $1 AND role_name = $2`, [userId.toString(), roleName]);
95
+ return res.rows.length > 0;
96
+ }
97
+ async getUserPermissions(userId) {
98
+ const res = await this.pgConnection.query(`SELECT permission_name FROM ${this.userPermissionsTable} WHERE user_id = $1`, [userId.toString()]);
99
+ return new Set(res.rows.map((row) => row.permission_name));
100
+ }
101
+ async addUserPermission(userId, permissionName) {
102
+ try {
103
+ await this.pgConnection.query(`INSERT INTO ${this.userPermissionsTable} (user_id, permission_name) VALUES ($1, $2)`, [userId.toString(), permissionName]);
104
+ }
105
+ catch (error) {
106
+ if (error.code === '23505') {
107
+ // Unique violation error
108
+ // Permission already assigned, ignore
109
+ }
110
+ else {
111
+ throw error;
112
+ }
113
+ }
114
+ }
115
+ async removeUserPermission(userId, permissionName) {
116
+ await this.pgConnection.query(`DELETE FROM ${this.userPermissionsTable} WHERE user_id = $1 AND permission_name = $2`, [userId.toString(), permissionName]);
117
+ }
118
+ async hasUserPermission(userId, permissionName) {
119
+ const count = await this.pgConnection.query(`SELECT 1 FROM ${this.userPermissionsTable} WHERE user_id = $1 AND permission_name = $2`, [userId.toString(), permissionName]);
120
+ return count.rows.length > 0;
121
+ }
122
+ async reset() {
123
+ try {
124
+ await this.pgConnection.truncateTables();
125
+ }
126
+ catch (error) {
127
+ // If truncation fails (e.g., tables don't exist), try initializing the schema
128
+ await this.pgConnection.initSchema();
129
+ }
130
+ }
131
+ }
132
+ exports.PgAuthzkitStore = PgAuthzkitStore;
133
+ //# sourceMappingURL=PgAuthzkitStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PgAuthzkitStore.js","sourceRoot":"","sources":["../../../src/stores/PgAuthzkitStore.ts"],"names":[],"mappings":"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"}