@jmruthers/pace-core 0.5.109 → 0.5.110

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 (144) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/{DataTable-5HITILXS.js → DataTable-D3BK2FCN.js} +4 -4
  3. package/dist/{api-5I3E47G2.js → api-PIE4JRFS.js} +2 -2
  4. package/dist/{chunk-P72NKAT5.js → chunk-3J5N2T2N.js} +51 -11
  5. package/dist/chunk-3J5N2T2N.js.map +1 -0
  6. package/dist/{chunk-3TKTL5AZ.js → chunk-7GBEBJLR.js} +26 -34
  7. package/dist/chunk-7GBEBJLR.js.map +1 -0
  8. package/dist/{chunk-S4D3Z723.js → chunk-AWK2FAUN.js} +3 -3
  9. package/dist/{chunk-WWNOVFDC.js → chunk-HADXAZT3.js} +2 -2
  10. package/dist/{chunk-UW2DE6JX.js → chunk-HGZSO43Y.js} +2 -2
  11. package/dist/{chunk-F6TSYCKP.js → chunk-XRSP3H52.js} +12 -7
  12. package/dist/chunk-XRSP3H52.js.map +1 -0
  13. package/dist/components.js +4 -4
  14. package/dist/hooks.js +1 -1
  15. package/dist/index.js +6 -6
  16. package/dist/rbac/index.d.ts +34 -22
  17. package/dist/rbac/index.js +3 -3
  18. package/dist/utils.js +1 -1
  19. package/docs/api/classes/ColumnFactory.md +1 -1
  20. package/docs/api/classes/ErrorBoundary.md +1 -1
  21. package/docs/api/classes/InvalidScopeError.md +1 -1
  22. package/docs/api/classes/MissingUserContextError.md +1 -1
  23. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  24. package/docs/api/classes/PermissionDeniedError.md +1 -1
  25. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  26. package/docs/api/classes/RBACAuditManager.md +1 -1
  27. package/docs/api/classes/RBACCache.md +1 -1
  28. package/docs/api/classes/RBACEngine.md +9 -8
  29. package/docs/api/classes/RBACError.md +1 -1
  30. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  31. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  32. package/docs/api/classes/StorageUtils.md +1 -1
  33. package/docs/api/enums/FileCategory.md +1 -1
  34. package/docs/api/interfaces/AggregateConfig.md +1 -1
  35. package/docs/api/interfaces/ButtonProps.md +1 -1
  36. package/docs/api/interfaces/CardProps.md +1 -1
  37. package/docs/api/interfaces/ColorPalette.md +1 -1
  38. package/docs/api/interfaces/ColorShade.md +1 -1
  39. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  40. package/docs/api/interfaces/DataRecord.md +1 -1
  41. package/docs/api/interfaces/DataTableAction.md +1 -1
  42. package/docs/api/interfaces/DataTableColumn.md +1 -1
  43. package/docs/api/interfaces/DataTableProps.md +1 -1
  44. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  45. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  46. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  47. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  48. package/docs/api/interfaces/FileMetadata.md +1 -1
  49. package/docs/api/interfaces/FileReference.md +1 -1
  50. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  51. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  52. package/docs/api/interfaces/FileUploadProps.md +1 -1
  53. package/docs/api/interfaces/FooterProps.md +1 -1
  54. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  55. package/docs/api/interfaces/InputProps.md +1 -1
  56. package/docs/api/interfaces/LabelProps.md +1 -1
  57. package/docs/api/interfaces/LoginFormProps.md +1 -1
  58. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  59. package/docs/api/interfaces/NavigationContextType.md +1 -1
  60. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  61. package/docs/api/interfaces/NavigationItem.md +1 -1
  62. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  63. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  64. package/docs/api/interfaces/Organisation.md +1 -1
  65. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  66. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  67. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  68. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  69. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  70. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  71. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  72. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  73. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  74. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  75. package/docs/api/interfaces/PaletteData.md +1 -1
  76. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  77. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  78. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  79. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  80. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  81. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  82. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  83. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  84. package/docs/api/interfaces/RBACConfig.md +19 -8
  85. package/docs/api/interfaces/RBACLogger.md +5 -5
  86. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  87. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  88. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  89. package/docs/api/interfaces/RouteConfig.md +1 -1
  90. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  91. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  92. package/docs/api/interfaces/StorageConfig.md +1 -1
  93. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  94. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  95. package/docs/api/interfaces/StorageListOptions.md +1 -1
  96. package/docs/api/interfaces/StorageListResult.md +1 -1
  97. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  98. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  99. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  100. package/docs/api/interfaces/StyleImport.md +1 -1
  101. package/docs/api/interfaces/SwitchProps.md +1 -1
  102. package/docs/api/interfaces/ToastActionElement.md +1 -1
  103. package/docs/api/interfaces/ToastProps.md +1 -1
  104. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  105. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  106. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  107. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  108. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  109. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  110. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  111. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  112. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  113. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  114. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  115. package/docs/api/interfaces/UserEventAccess.md +1 -1
  116. package/docs/api/interfaces/UserMenuProps.md +1 -1
  117. package/docs/api/interfaces/UserProfile.md +1 -1
  118. package/docs/api/modules.md +21 -20
  119. package/docs/documentation-index.md +0 -2
  120. package/docs/rbac/README.md +114 -38
  121. package/docs/rbac/api-reference.md +63 -16
  122. package/docs/rbac/getting-started.md +16 -16
  123. package/docs/rbac/quick-start.md +110 -35
  124. package/docs/rbac/troubleshooting.md +125 -2
  125. package/package.json +1 -1
  126. package/src/components/NavigationMenu/NavigationMenu.test.tsx +38 -4
  127. package/src/components/NavigationMenu/NavigationMenu.tsx +71 -6
  128. package/src/rbac/api.test.ts +2 -2
  129. package/src/rbac/api.ts +2 -1
  130. package/src/rbac/components/PagePermissionGuard.tsx +21 -38
  131. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +1 -1
  132. package/src/rbac/config.ts +2 -0
  133. package/src/rbac/engine.ts +15 -5
  134. package/src/rbac/security.ts +1 -1
  135. package/dist/chunk-3TKTL5AZ.js.map +0 -1
  136. package/dist/chunk-F6TSYCKP.js.map +0 -1
  137. package/dist/chunk-P72NKAT5.js.map +0 -1
  138. package/docs/rbac/breaking-changes-v3.md +0 -222
  139. package/docs/rbac/migration-guide.md +0 -260
  140. /package/dist/{DataTable-5HITILXS.js.map → DataTable-D3BK2FCN.js.map} +0 -0
  141. /package/dist/{api-5I3E47G2.js.map → api-PIE4JRFS.js.map} +0 -0
  142. /package/dist/{chunk-S4D3Z723.js.map → chunk-AWK2FAUN.js.map} +0 -0
  143. /package/dist/{chunk-WWNOVFDC.js.map → chunk-HADXAZT3.js.map} +0 -0
  144. /package/dist/{chunk-UW2DE6JX.js.map → chunk-HGZSO43Y.js.map} +0 -0
@@ -1,222 +0,0 @@
1
- ---
2
- lastUpdated: 2025-10-29T22:43:00+11:00
3
- version: 0.5.76
4
- reviewedBy: content-audit
5
- ---
6
-
7
- # Breaking Changes in v3.0.0
8
-
9
- This document describes all breaking changes in pace-core v3.0.0, specifically related to the auth/RBAC system.
10
-
11
- ## Summary
12
-
13
- The auth/RBAC system has been significantly enhanced with mandatory security validation, comprehensive audit logging, and improved rate limiting. These changes improve security but require migration for existing code.
14
-
15
- ## Breaking Changes
16
-
17
- ### 1. Mandatory SecurityContext in RBACEngine
18
-
19
- **Changed**: `SecurityContext` parameter is now required in `RBACEngine.isPermitted()`
20
-
21
- **Before**:
22
- ```typescript
23
- await engine.isPermitted({ userId, scope, permission });
24
- ```
25
-
26
- **After**:
27
- ```typescript
28
- await engine.isPermitted(
29
- { userId, scope, permission },
30
- { userId, organisationId, timestamp: new Date() }
31
- );
32
- ```
33
-
34
- **Migration**: Use the API layer's `isPermitted()` function which automatically creates the security context:
35
-
36
- ```typescript
37
- import { isPermitted } from '@jmruthers/pace-core/rbac';
38
-
39
- // No changes needed - API handles security context automatically
40
- await isPermitted({ userId, scope, permission });
41
- ```
42
-
43
- ### 2. Enhanced Rate Limiting
44
-
45
- **Changed**: Rate limiting is now mandatory and enforced on all permission checks
46
-
47
- **Before**: Optional rate limiting that always returned true
48
-
49
- **After**: Mandatory rate limiting with configurable limits (default: 100 requests/minute)
50
-
51
- **Impact**: High-traffic applications may need to increase the limit:
52
-
53
- ```typescript
54
- import { setupRBAC } from '@jmruthers/pace-core/rbac';
55
-
56
- setupRBAC(supabase, {
57
- maxPermissionChecksPerMinute: 200 // Customize as needed
58
- });
59
- ```
60
-
61
- ### 3. Comprehensive Audit Logging
62
-
63
- **Changed**: All permission checks are now audited, including those without organisation context
64
-
65
- **Before**: Audit events only emitted when organisationId was present
66
-
67
- **After**: All permission checks are audited with special handling for events without organisation context
68
-
69
- **Impact**: The `rbac_audit_events` table now includes:
70
- - Events without organisation context (using null UUID fallback)
71
- - Metadata flag `no_organisation_context: true` for tracking
72
- - More comprehensive security monitoring
73
-
74
- ### 4. Optional organisationId in SecurityContext
75
-
76
- **Changed**: `organisationId` is now optional in `SecurityContext` interface
77
-
78
- **Before**:
79
- ```typescript
80
- interface SecurityContext {
81
- userId: UUID;
82
- organisationId: UUID; // Required
83
- timestamp: Date;
84
- }
85
- ```
86
-
87
- **After**:
88
- ```typescript
89
- interface SecurityContext {
90
- userId: UUID;
91
- organisationId?: UUID; // Optional
92
- timestamp: Date;
93
- }
94
- ```
95
-
96
- **Impact**: No breaking change for consumers - the field is now optional.
97
-
98
- ### 5. Input Validation is Mandatory
99
-
100
- **Changed**: Input validation is now always performed, not conditional on securityContext presence
101
-
102
- **Before**: Input validation only performed if securityContext was provided
103
-
104
- **After**: Input validation is mandatory for all permission checks
105
-
106
- **Impact**: Invalid inputs will trigger security events and deny access.
107
-
108
- **Required validations**:
109
- - User ID must be valid UUID
110
- - Permission must match `operation:resource` pattern
111
- - Scope must include at least one valid identifier
112
-
113
- ## Non-Breaking Changes
114
-
115
- ### Enhanced Security Event Logging
116
-
117
- Security events are now logged with more detail:
118
- - Timestamp
119
- - User agent
120
- - IP address (when available)
121
- - Context information
122
-
123
- ### Improved Rate Limiting
124
-
125
- Rate limiting now uses sliding window algorithm instead of simple counters:
126
- - More accurate limiting
127
- - Automatic cleanup of expired entries
128
- - Memory-efficient implementation
129
-
130
- ## Migration Timeline
131
-
132
- ### Deprecation Period (v2.0.0 - v2.9.0)
133
-
134
- - All changes marked as deprecated
135
- - Warnings in console
136
- - Backward compatibility maintained
137
-
138
- ### Breaking Changes (v3.0.0)
139
-
140
- - SecurityContext mandatory
141
- - Rate limiting mandatory
142
- - All breaking changes enforced
143
-
144
- ### Support Period
145
-
146
- - Migration guide available
147
- - Community support provided
148
- - Automated migration tools (where possible)
149
-
150
- ## Upgrade Instructions
151
-
152
- 1. **Update Dependencies**:
153
- ```bash
154
- npm install @jmruthers/pace-core@^3.0.0
155
- ```
156
-
157
- 2. **Review Breaking Changes**: Read this document and the migration guide
158
-
159
- 3. **Update Code**: Apply migration patterns from the [Migration Guide](./migration-guide.md)
160
-
161
- 4. **Test**: Run your test suite and verify all permission checks work
162
-
163
- 5. **Monitor**: Check logs for security events and rate limiting
164
-
165
- ## Compatibility Matrix
166
-
167
- | Feature | v2.0.0 | v3.0.0 |
168
- |---------|--------|--------|
169
- | Optional SecurityContext | ✅ | ❌ |
170
- | Rate Limiting | Optional | Mandatory |
171
- | Input Validation | Conditional | Always |
172
- | Audit Logging | Partial | Complete |
173
- | Type Safety | Basic | Enhanced |
174
-
175
- ## Frequently Asked Questions
176
-
177
- ### Q: Why is SecurityContext now mandatory?
178
-
179
- **A**: To ensure all permission checks go through proper security validation, rate limiting, and audit logging. This prevents security vulnerabilities where validation is skipped.
180
-
181
- ### Q: Will rate limiting affect my app's performance?
182
-
183
- **A**: The default limit of 100 requests/minute is generous for most applications. High-traffic apps can increase this limit or implement caching to reduce permission check frequency.
184
-
185
- ### Q: How do I handle events without organisation context?
186
-
187
- **A**: Use the `no_organisation_context` metadata flag in audit queries:
188
-
189
- ```typescript
190
- const { data } = await supabase
191
- .from('rbac_audit_events')
192
- .select('*')
193
- .eq('metadata->no_organisation_context', true);
194
- ```
195
-
196
- ### Q: Can I disable rate limiting?
197
-
198
- **A**: No. Rate limiting is mandatory for security. However, you can increase the limit if needed.
199
-
200
- ### Q: Will existing code break?
201
-
202
- **A**: Only if you're calling `RBACEngine.isPermitted()` directly. Using the API layer's `isPermitted()` function maintains backward compatibility.
203
-
204
- ## Getting Help
205
-
206
- - **Migration Guide**: See [Migration Guide](./migration-guide.md)
207
- - **API Reference**: See [API Reference](./api-reference.md)
208
- - **Troubleshooting**: See [Troubleshooting Guide](./troubleshooting.md)
209
- - **Issues**: Open an issue on the project repository
210
-
211
- ## Changelog
212
-
213
- Full changelog for v3.0.0:
214
-
215
- - ✅ Made SecurityContext mandatory in RBACEngine
216
- - ✅ Implemented real rate limiting with sliding window algorithm
217
- - ✅ Enhanced audit logging to include all permission checks
218
- - ✅ Made organisationId optional in SecurityContext
219
- - ✅ Added comprehensive input validation
220
- - ✅ Improved security event logging
221
- - ✅ Added metadata flags for tracking events without organisation context
222
-
@@ -1,260 +0,0 @@
1
- ---
2
- lastUpdated: 2025-10-29T22:43:00+11:00
3
- version: 0.5.76
4
- reviewedBy: content-audit
5
- ---
6
-
7
- # RBAC Migration Guide - Breaking Changes
8
-
9
- This guide helps you migrate to the new mandatory security validation in the RBAC system.
10
-
11
- ## Overview
12
-
13
- The RBAC system now requires mandatory security validation for all permission checks. This ensures all operations go through proper security validation, rate limiting, and audit logging.
14
-
15
- ## What Changed
16
-
17
- ### Before (v2.0.0 and earlier)
18
-
19
- ```typescript
20
- // SecurityContext was optional
21
- const hasPermission = await engine.isPermitted({
22
- userId,
23
- scope,
24
- permission
25
- }); // No securityContext parameter
26
- ```
27
-
28
- ### After (v3.0.0)
29
-
30
- ```typescript
31
- // SecurityContext is now mandatory
32
- const hasPermission = await engine.isPermitted({
33
- userId,
34
- scope,
35
- permission
36
- }, {
37
- userId,
38
- organisationId: scope.organisationId,
39
- timestamp: new Date()
40
- });
41
- ```
42
-
43
- ## Migration Options
44
-
45
- ### Option 1: Use the API Layer (Recommended)
46
-
47
- The easiest migration path is to use the `isPermitted()` function from the API layer, which automatically creates the security context:
48
-
49
- ```typescript
50
- import { isPermitted } from '@jmruthers/pace-core/rbac';
51
-
52
- // No changes needed - API creates security context automatically
53
- const hasPermission = await isPermitted({
54
- userId,
55
- scope,
56
- permission
57
- });
58
- ```
59
-
60
- ### Option 2: Create Security Context Manually
61
-
62
- If you're calling the engine directly, create a security context:
63
-
64
- ```typescript
65
- import { RBACEngine, setupRBAC } from '@jmruthers/pace-core/rbac';
66
-
67
- // Setup RBAC once
68
- setupRBAC(supabase);
69
-
70
- // Create security context
71
- const securityContext = {
72
- userId,
73
- organisationId: scope.organisationId,
74
- timestamp: new Date()
75
- };
76
-
77
- // Use with engine
78
- const engine = getRBACEngine();
79
- const hasPermission = await engine.isPermitted({
80
- userId,
81
- scope,
82
- permission
83
- }, securityContext);
84
- ```
85
-
86
- ## Breaking Changes
87
-
88
- ### 1. SecurityContext Now Required
89
-
90
- **Impact**: All direct calls to `RBACEngine.isPermitted()` must provide security context.
91
-
92
- **Migration**: Use the API layer's `isPermitted()` function instead of calling the engine directly.
93
-
94
- ### 2. organisationId Now Optional in SecurityContext
95
-
96
- **Impact**: Events without organisation context (e.g., global admin operations) are now properly logged.
97
-
98
- **Migration**: No action needed if you're using the API layer. If creating security context manually, you can omit `organisationId`:
99
-
100
- ```typescript
101
- const securityContext = {
102
- userId,
103
- // organisationId is now optional
104
- timestamp: new Date()
105
- };
106
- ```
107
-
108
- ## Enhanced Features
109
-
110
- ### 1. Mandatory Rate Limiting
111
-
112
- All permission checks now go through rate limiting. By default, users are limited to 100 permission checks per minute.
113
-
114
- To configure rate limits:
115
-
116
- ```typescript
117
- import { setupRBAC } from '@jmruthers/pace-core/rbac';
118
-
119
- setupRBAC(supabase, {
120
- maxPermissionChecksPerMinute: 200 // Increase for high-traffic apps
121
- });
122
- ```
123
-
124
- ### 2. Comprehensive Audit Logging
125
-
126
- All permission checks are now audited, including:
127
- - Super admin bypasses
128
- - Operations without organisation context
129
- - Failed authentication attempts
130
-
131
- Audit events are stored in the `rbac_audit_events` table with the following structure:
132
-
133
- ```typescript
134
- {
135
- event_type: 'permission_check' | 'permission_denied' | 'role_granted' | 'role_denied' | 'rls_denied',
136
- user_id: UUID,
137
- organisation_id: UUID, // May be null UUID for global operations
138
- event_id?: string,
139
- app_id?: UUID,
140
- page_id?: UUID,
141
- permission?: string,
142
- decision?: boolean,
143
- source: 'api' | 'ui' | 'middleware' | 'rls',
144
- bypass?: boolean,
145
- duration_ms?: number,
146
- metadata: {
147
- cache_hit?: boolean,
148
- cache_source?: 'memory' | 'database' | 'rpc',
149
- no_organisation_context?: boolean
150
- }
151
- }
152
- ```
153
-
154
- ### 3. Input Validation
155
-
156
- All inputs are now validated before processing:
157
- - User ID format (must be valid UUID)
158
- - Permission format (must match `operation:resource` pattern)
159
- - Scope format (must include at least one valid identifier)
160
-
161
- Invalid inputs trigger security events and return false (deny access).
162
-
163
- ## Security Improvements
164
-
165
- ### Rate Limiting
166
-
167
- The system now implements in-memory rate limiting with a sliding window algorithm:
168
-
169
- - **Window**: 1 minute
170
- - **Default limit**: 100 requests per minute per user
171
- - **Automatic cleanup**: Expired entries are cleared every 5 minutes
172
-
173
- To implement distributed rate limiting, migrate to Redis or Supabase Edge Functions.
174
-
175
- ### Security Event Logging
176
-
177
- Security events are now logged even without organisation context:
178
-
179
- ```typescript
180
- // These events are now audited:
181
- // 1. Super admin bypasses (bypass: true)
182
- // 2. Permission denied events
183
- // 3. Invalid input events
184
- // 4. Rate limit exceeded events
185
- // 5. Suspicious activity events
186
- ```
187
-
188
- ## Migration Checklist
189
-
190
- - [ ] Update all calls to `RBACEngine.isPermitted()` to use API layer
191
- - [ ] Remove optional securityContext parameters from code
192
- - [ ] Configure rate limits for your application's needs
193
- - [ ] Update audit log queries to handle events without organisation context
194
- - [ ] Test permission checks with various user roles
195
- - [ ] Monitor rate limiting to ensure no false positives
196
-
197
- ## Backward Compatibility
198
-
199
- The API layer maintains backward compatibility:
200
-
201
- ```typescript
202
- // This still works - API creates security context automatically
203
- import { isPermitted } from '@jmruthers/pace-core/rbac';
204
-
205
- const hasPermission = await isPermitted({
206
- userId,
207
- scope,
208
- permission
209
- });
210
- ```
211
-
212
- ## Common Issues
213
-
214
- ### Issue: Rate Limit Exceeded
215
-
216
- **Symptom**: `rate_limit_exceeded` security events in logs.
217
-
218
- **Solution**: Increase the rate limit or implement caching for frequently accessed permissions.
219
-
220
- ### Issue: Invalid Input
221
-
222
- **Symptom**: Permission checks returning false with `invalid_input` events.
223
-
224
- **Solution**: Ensure all UUIDs are valid and permission strings match the `operation:resource` pattern.
225
-
226
- ### Issue: Missing Organisation Context
227
-
228
- **Symptom**: Warnings in console about missing organisation context.
229
-
230
- **Solution**: Either provide organisation context or update your queries to filter by `no_organisation_context` metadata flag.
231
-
232
- ## Testing Your Migration
233
-
234
- 1. **Test with all user roles**:
235
- - Super admin
236
- - Organisation admin
237
- - Event admin
238
- - Regular users
239
-
240
- 2. **Test rate limiting**:
241
- - Make more than 100 permission checks in a minute
242
- - Verify rate limit exceeded events are logged
243
-
244
- 3. **Test audit logging**:
245
- - Check `rbac_audit_events` table
246
- - Verify all permission checks are logged
247
- - Verify events without organisation context are flagged
248
-
249
- 4. **Test error handling**:
250
- - Invalid UUIDs
251
- - Malformed permission strings
252
- - Missing required fields
253
-
254
- ## Support
255
-
256
- For questions or issues with the migration, please:
257
- 1. Check the [Troubleshooting Guide](./troubleshooting.md)
258
- 2. Review the [API Reference](./api-reference.md)
259
- 3. Open an issue on the project repository
260
-