@latanda/auth-middleware 1.0.1

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.
package/src/rbac.js ADDED
@@ -0,0 +1,180 @@
1
+ /**
2
+ * Role-Based Access Control (RBAC) System
3
+ * Extracted from La Tanda production system
4
+ * Supports: ADMIN, MIT (Member-in-Trust), IT (Information Technology), USER
5
+ */
6
+
7
+ /**
8
+ * Role hierarchy and permissions mapping
9
+ */
10
+ const ROLES = {
11
+ ADMIN: {
12
+ name: 'ADMIN',
13
+ level: 100,
14
+ permissions: [
15
+ 'full_access',
16
+ 'user_management',
17
+ 'system_config',
18
+ 'approve_deposits',
19
+ 'manage_groups',
20
+ 'view_analytics',
21
+ 'manage_roles',
22
+ 'delete_users',
23
+ 'system_settings'
24
+ ]
25
+ },
26
+ MIT: {
27
+ name: 'MIT', // Member-in-Trust (Group coordinator)
28
+ level: 50,
29
+ permissions: [
30
+ 'create_groups',
31
+ 'manage_own_groups',
32
+ 'approve_members',
33
+ 'view_group_analytics',
34
+ 'edit_group_settings'
35
+ ]
36
+ },
37
+ IT: {
38
+ name: 'IT', // Information Technology (Developer/Support)
39
+ level: 75,
40
+ permissions: [
41
+ 'view_system_logs',
42
+ 'debug_access',
43
+ 'api_access',
44
+ 'view_analytics',
45
+ 'technical_support'
46
+ ]
47
+ },
48
+ USER: {
49
+ name: 'USER',
50
+ level: 10,
51
+ permissions: [
52
+ 'view_own_profile',
53
+ 'edit_own_profile',
54
+ 'join_groups',
55
+ 'make_payments',
56
+ 'view_own_transactions'
57
+ ]
58
+ }
59
+ };
60
+
61
+ /**
62
+ * Check if user has specific permission
63
+ * @param {string} userRole - User's role (ADMIN, MIT, IT, USER)
64
+ * @param {string} requiredPermission - Permission to check
65
+ * @returns {boolean} True if user has permission
66
+ */
67
+ function hasPermission(userRole, requiredPermission) {
68
+ const role = ROLES[userRole];
69
+ if (!role) return false;
70
+
71
+ // ADMIN has all permissions
72
+ if (userRole === 'ADMIN') return true;
73
+
74
+ return role.permissions.includes(requiredPermission);
75
+ }
76
+
77
+ /**
78
+ * Check if user has any of the specified permissions
79
+ * @param {string} userRole - User's role
80
+ * @param {string[]} permissions - Array of permissions to check
81
+ * @returns {boolean} True if user has at least one permission
82
+ */
83
+ function hasAnyPermission(userRole, permissions) {
84
+ return permissions.some(permission => hasPermission(userRole, permission));
85
+ }
86
+
87
+ /**
88
+ * Check if user has all of the specified permissions
89
+ * @param {string} userRole - User's role
90
+ * @param {string[]} permissions - Array of permissions to check
91
+ * @returns {boolean} True if user has all permissions
92
+ */
93
+ function hasAllPermissions(userRole, permissions) {
94
+ return permissions.every(permission => hasPermission(userRole, permission));
95
+ }
96
+
97
+ /**
98
+ * Check if user's role is at or above required level
99
+ * @param {string} userRole - User's role
100
+ * @param {string} requiredRole - Minimum required role
101
+ * @returns {boolean} True if user's role level meets requirement
102
+ */
103
+ function hasRoleLevel(userRole, requiredRole) {
104
+ const userRoleData = ROLES[userRole];
105
+ const requiredRoleData = ROLES[requiredRole];
106
+
107
+ if (!userRoleData || !requiredRoleData) return false;
108
+
109
+ return userRoleData.level >= requiredRoleData.level;
110
+ }
111
+
112
+ /**
113
+ * Get all permissions for a role
114
+ * @param {string} role - Role name
115
+ * @returns {string[]} Array of permissions
116
+ */
117
+ function getRolePermissions(role) {
118
+ const roleData = ROLES[role];
119
+ return roleData ? roleData.permissions : [];
120
+ }
121
+
122
+ /**
123
+ * Check if role is valid
124
+ * @param {string} role - Role to validate
125
+ * @returns {boolean} True if role exists
126
+ */
127
+ function isValidRole(role) {
128
+ return Object.keys(ROLES).includes(role);
129
+ }
130
+
131
+ /**
132
+ * Enforce resource ownership (user can only access their own resources)
133
+ * @param {string} userId - Authenticated user ID
134
+ * @param {string} resourceOwnerId - Resource owner ID
135
+ * @param {string} userRole - User's role (ADMINs bypass this check)
136
+ * @returns {boolean} True if user owns resource or is ADMIN
137
+ */
138
+ function canAccessResource(userId, resourceOwnerId, userRole) {
139
+ // ADMIN can access all resources
140
+ if (userRole === 'ADMIN') return true;
141
+
142
+ // User must own the resource
143
+ return userId === resourceOwnerId;
144
+ }
145
+
146
+ /**
147
+ * Check if user can perform action on group
148
+ * @param {string} userId - Authenticated user ID
149
+ * @param {Object} group - Group object with creator_id
150
+ * @param {string} userRole - User's role
151
+ * @param {string} action - Action to perform (edit, delete, approve_members, etc.)
152
+ * @returns {boolean} True if action is allowed
153
+ */
154
+ function canPerformGroupAction(userId, group, userRole, action) {
155
+ // ADMIN can do anything
156
+ if (userRole === 'ADMIN') return true;
157
+
158
+ // MIT can manage their own groups
159
+ if (userRole === 'MIT' && group.creator_id === userId) {
160
+ const mitActions = ['edit', 'delete', 'approve_members', 'manage_settings'];
161
+ return mitActions.includes(action);
162
+ }
163
+
164
+ // Regular users can only view
165
+ if (action === 'view') return true;
166
+
167
+ return false;
168
+ }
169
+
170
+ module.exports = {
171
+ ROLES,
172
+ hasPermission,
173
+ hasAnyPermission,
174
+ hasAllPermissions,
175
+ hasRoleLevel,
176
+ getRolePermissions,
177
+ isValidRole,
178
+ canAccessResource,
179
+ canPerformGroupAction
180
+ };