@jmruthers/pace-core 0.5.114 → 0.5.116

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 (236) hide show
  1. package/dist/{AuthService-CVgsgtaZ.d.ts → AuthService-D4646R4b.d.ts} +9 -4
  2. package/dist/{DataTable-3JRLZXER.js → DataTable-ZOAKQ3SU.js} +10 -9
  3. package/dist/{UnifiedAuthProvider-KZZUO27W.js → UnifiedAuthProvider-YFN7YGVN.js} +4 -3
  4. package/dist/{api-PKU4PUBO.js → api-TNIBJWLM.js} +3 -3
  5. package/dist/{audit-H4YJJF7R.js → audit-T36HM7IM.js} +2 -2
  6. package/dist/{chunk-4OX5PXHX.js → chunk-2GJ5GL77.js} +4 -5
  7. package/dist/chunk-2GJ5GL77.js.map +1 -0
  8. package/dist/{chunk-5YIZFEUQ.js → chunk-2LM4QQGH.js} +31 -35
  9. package/dist/chunk-2LM4QQGH.js.map +1 -0
  10. package/dist/{chunk-3OGQLOJM.js → chunk-3DBFLLLU.js} +30 -1
  11. package/dist/chunk-3DBFLLLU.js.map +1 -0
  12. package/dist/{chunk-KTHLNIMA.js → chunk-ECOVPXYS.js} +13 -62
  13. package/dist/chunk-ECOVPXYS.js.map +1 -0
  14. package/dist/{chunk-OO3V7W4H.js → chunk-KA3PSVNV.js} +87 -40
  15. package/dist/chunk-KA3PSVNV.js.map +1 -0
  16. package/dist/{chunk-HKWQN44G.js → chunk-KMPWND3F.js} +15 -15
  17. package/dist/{chunk-L36JW4KV.js → chunk-LFS45U62.js} +2 -2
  18. package/dist/{chunk-NEONKMTU.js → chunk-LZYHAL7Y.js} +9 -4
  19. package/dist/{chunk-NEONKMTU.js.map → chunk-LZYHAL7Y.js.map} +1 -1
  20. package/dist/{chunk-BUN7NMV7.js → chunk-O3FTRYEU.js} +2 -2
  21. package/dist/{chunk-F6QB26OS.js → chunk-P3PUOL6B.js} +80 -8
  22. package/dist/chunk-P3PUOL6B.js.map +1 -0
  23. package/dist/{chunk-ZPXWJA4H.js → chunk-PHDAXDHB.js} +131 -5
  24. package/dist/chunk-PHDAXDHB.js.map +1 -0
  25. package/dist/chunk-UJI6WSMD.js +201 -0
  26. package/dist/{chunk-5CDJCTOO.js.map → chunk-UJI6WSMD.js.map} +1 -1
  27. package/dist/{chunk-JHWQNJP3.js → chunk-UKZWNQMB.js} +65 -19
  28. package/dist/{chunk-JHWQNJP3.js.map → chunk-UKZWNQMB.js.map} +1 -1
  29. package/dist/{chunk-7H75SHXZ.js → chunk-VN3OOE35.js} +2 -2
  30. package/dist/{chunk-QKIVSZ2O.js → chunk-WP5I5GLN.js} +2 -2
  31. package/dist/components.d.ts +1 -1
  32. package/dist/components.js +12 -11
  33. package/dist/components.js.map +1 -1
  34. package/dist/hooks.d.ts +1 -1
  35. package/dist/hooks.js +10 -9
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/index.d.ts +4 -4
  38. package/dist/index.js +19 -16
  39. package/dist/index.js.map +1 -1
  40. package/dist/providers.d.ts +2 -2
  41. package/dist/providers.js +3 -2
  42. package/dist/rbac/index.d.ts +82 -1
  43. package/dist/rbac/index.js +13 -10
  44. package/dist/{useToast-DRah6K-g.d.ts → useToast-Cs_g32bg.d.ts} +8 -6
  45. package/dist/utils.js +6 -4
  46. package/dist/utils.js.map +1 -1
  47. package/dist/validation.js +3 -1
  48. package/dist/validation.js.map +1 -1
  49. package/docs/README.md +4 -0
  50. package/docs/api/classes/ColumnFactory.md +1 -1
  51. package/docs/api/classes/ErrorBoundary.md +1 -1
  52. package/docs/api/classes/InvalidScopeError.md +1 -1
  53. package/docs/api/classes/MissingUserContextError.md +1 -1
  54. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  55. package/docs/api/classes/PermissionDeniedError.md +1 -1
  56. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  57. package/docs/api/classes/RBACAuditManager.md +35 -12
  58. package/docs/api/classes/RBACCache.md +1 -1
  59. package/docs/api/classes/RBACEngine.md +1 -1
  60. package/docs/api/classes/RBACError.md +1 -1
  61. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  62. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  63. package/docs/api/classes/StorageUtils.md +1 -1
  64. package/docs/api/enums/FileCategory.md +1 -1
  65. package/docs/api/interfaces/AggregateConfig.md +1 -1
  66. package/docs/api/interfaces/ButtonProps.md +1 -1
  67. package/docs/api/interfaces/CardProps.md +1 -1
  68. package/docs/api/interfaces/ColorPalette.md +1 -1
  69. package/docs/api/interfaces/ColorShade.md +1 -1
  70. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  71. package/docs/api/interfaces/DataRecord.md +1 -1
  72. package/docs/api/interfaces/DataTableAction.md +1 -1
  73. package/docs/api/interfaces/DataTableColumn.md +1 -1
  74. package/docs/api/interfaces/DataTableProps.md +1 -1
  75. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  76. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  77. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  78. package/docs/api/interfaces/EventAppRoleData.md +71 -0
  79. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  80. package/docs/api/interfaces/FileMetadata.md +1 -1
  81. package/docs/api/interfaces/FileReference.md +1 -1
  82. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  83. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  84. package/docs/api/interfaces/FileUploadProps.md +1 -1
  85. package/docs/api/interfaces/FooterProps.md +1 -1
  86. package/docs/api/interfaces/GrantEventAppRoleParams.md +122 -0
  87. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  88. package/docs/api/interfaces/InputProps.md +1 -1
  89. package/docs/api/interfaces/LabelProps.md +1 -1
  90. package/docs/api/interfaces/LoginFormProps.md +1 -1
  91. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  92. package/docs/api/interfaces/NavigationContextType.md +1 -1
  93. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  94. package/docs/api/interfaces/NavigationItem.md +1 -1
  95. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  97. package/docs/api/interfaces/Organisation.md +1 -1
  98. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  99. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  100. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  101. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  102. package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
  103. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  104. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  105. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  106. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  107. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  108. package/docs/api/interfaces/PaletteData.md +1 -1
  109. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  110. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  111. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  112. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  113. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  114. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  115. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  116. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  117. package/docs/api/interfaces/RBACConfig.md +1 -1
  118. package/docs/api/interfaces/RBACLogger.md +1 -1
  119. package/docs/api/interfaces/RevokeEventAppRoleParams.md +100 -0
  120. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  121. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  122. package/docs/api/interfaces/RoleManagementResult.md +52 -0
  123. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  124. package/docs/api/interfaces/RouteConfig.md +1 -1
  125. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  126. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  127. package/docs/api/interfaces/StorageConfig.md +1 -1
  128. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  129. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  130. package/docs/api/interfaces/StorageListOptions.md +1 -1
  131. package/docs/api/interfaces/StorageListResult.md +1 -1
  132. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  133. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  134. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  135. package/docs/api/interfaces/StyleImport.md +1 -1
  136. package/docs/api/interfaces/SwitchProps.md +1 -1
  137. package/docs/api/interfaces/ToastActionElement.md +1 -1
  138. package/docs/api/interfaces/ToastProps.md +1 -1
  139. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  140. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  141. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  142. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  143. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  144. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  145. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  146. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  147. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  148. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  149. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  150. package/docs/api/interfaces/UserEventAccess.md +1 -1
  151. package/docs/api/interfaces/UserMenuProps.md +1 -1
  152. package/docs/api/interfaces/UserProfile.md +1 -1
  153. package/docs/api/modules.md +43 -16
  154. package/docs/architecture/rpc-function-standards.md +193 -0
  155. package/package.json +1 -1
  156. package/src/__tests__/TEST_STANDARD.md +244 -2
  157. package/src/components/DataTable/__tests__/a11y.basic.test.tsx +46 -16
  158. package/src/components/DataTable/__tests__/keyboard.test.tsx +276 -217
  159. package/src/components/DataTable/components/DataTableCore.tsx +32 -17
  160. package/src/components/DataTable/components/DataTableToolbar.tsx +3 -2
  161. package/src/components/DataTable/components/EditableRow.tsx +18 -1
  162. package/src/components/DataTable/components/ImportModal.tsx +25 -2
  163. package/src/components/DataTable/components/ViewRowModal.tsx +1 -1
  164. package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +735 -0
  165. package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +572 -0
  166. package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +708 -0
  167. package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +451 -0
  168. package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +456 -0
  169. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +454 -0
  170. package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +462 -0
  171. package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +423 -0
  172. package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +393 -0
  173. package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +617 -0
  174. package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +734 -0
  175. package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +412 -0
  176. package/src/components/DataTable/hooks/useTableHandlers.ts +4 -0
  177. package/src/components/EventSelector/EventSelector.tsx +5 -25
  178. package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +12 -7
  179. package/src/components/PaceAppLayout/PaceAppLayout.tsx +4 -0
  180. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +7 -2
  181. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +13 -8
  182. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +109 -100
  183. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +18 -13
  184. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +17 -12
  185. package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +2 -0
  186. package/src/components/PaceLoginPage/PaceLoginPage.tsx +11 -1
  187. package/src/components/PasswordReset/PasswordChangeForm.test.tsx +2 -2
  188. package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +648 -0
  189. package/src/components/ProtectedRoute/ProtectedRoute.tsx +10 -7
  190. package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +4 -12
  191. package/src/components/Select/Select.tsx +8 -0
  192. package/src/components/Toast/Toast.test.tsx +8 -7
  193. package/src/components/Toast/Toast.tsx +4 -4
  194. package/src/hooks/__tests__/usePublicEvent.simple.test.ts +367 -3
  195. package/src/hooks/__tests__/usePublicFileDisplay.test.ts +916 -0
  196. package/src/hooks/useEventTheme.ts +49 -18
  197. package/src/hooks/usePermissionCache.ts +5 -3
  198. package/src/hooks/useSecureDataAccess.ts +11 -1
  199. package/src/hooks/useToast.ts +11 -12
  200. package/src/providers/services/EventServiceProvider.tsx +15 -8
  201. package/src/rbac/__tests__/cache-invalidation.test.ts +385 -0
  202. package/src/rbac/audit.test.ts +206 -0
  203. package/src/rbac/audit.ts +37 -2
  204. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +26 -23
  205. package/src/rbac/errors.test.ts +340 -0
  206. package/src/rbac/hooks/index.ts +9 -0
  207. package/src/rbac/hooks/useResolvedScope.test.ts +1063 -0
  208. package/src/rbac/hooks/useRoleManagement.test.ts +908 -0
  209. package/src/rbac/hooks/useRoleManagement.ts +255 -0
  210. package/src/services/AuthService.ts +10 -0
  211. package/src/services/EventService.ts +111 -50
  212. package/src/services/__tests__/AuthService.test.ts +1 -1
  213. package/src/services/__tests__/EventService.test.ts +60 -45
  214. package/src/services/interfaces/IEventService.ts +1 -1
  215. package/src/utils/__tests__/deviceFingerprint.unit.test.ts +320 -0
  216. package/src/utils/__tests__/logger.unit.test.ts +398 -0
  217. package/src/utils/__tests__/validation.unit.test.ts +225 -1
  218. package/src/utils/file-reference.test.ts +214 -0
  219. package/dist/chunk-3OGQLOJM.js.map +0 -1
  220. package/dist/chunk-4OX5PXHX.js.map +0 -1
  221. package/dist/chunk-5CDJCTOO.js +0 -190
  222. package/dist/chunk-5YIZFEUQ.js.map +0 -1
  223. package/dist/chunk-F6QB26OS.js.map +0 -1
  224. package/dist/chunk-KTHLNIMA.js.map +0 -1
  225. package/dist/chunk-OO3V7W4H.js.map +0 -1
  226. package/dist/chunk-ZPXWJA4H.js.map +0 -1
  227. package/src/rbac/audit-enhanced.ts +0 -351
  228. /package/dist/{DataTable-3JRLZXER.js.map → DataTable-ZOAKQ3SU.js.map} +0 -0
  229. /package/dist/{UnifiedAuthProvider-KZZUO27W.js.map → UnifiedAuthProvider-YFN7YGVN.js.map} +0 -0
  230. /package/dist/{api-PKU4PUBO.js.map → api-TNIBJWLM.js.map} +0 -0
  231. /package/dist/{audit-H4YJJF7R.js.map → audit-T36HM7IM.js.map} +0 -0
  232. /package/dist/{chunk-HKWQN44G.js.map → chunk-KMPWND3F.js.map} +0 -0
  233. /package/dist/{chunk-L36JW4KV.js.map → chunk-LFS45U62.js.map} +0 -0
  234. /package/dist/{chunk-BUN7NMV7.js.map → chunk-O3FTRYEU.js.map} +0 -0
  235. /package/dist/{chunk-7H75SHXZ.js.map → chunk-VN3OOE35.js.map} +0 -0
  236. /package/dist/{chunk-QKIVSZ2O.js.map → chunk-WP5I5GLN.js.map} +0 -0
@@ -1,351 +0,0 @@
1
- /**
2
- * Enhanced RBAC Audit Manager
3
- * @package @jmruthers/pace-core
4
- * @module RBAC/AuditEnhanced
5
- * @since 1.0.0
6
- *
7
- * This module provides an enhanced audit manager that can handle both
8
- * authenticated user contexts and service role contexts for audit logging.
9
- */
10
-
11
- import { SupabaseClient } from '@supabase/supabase-js';
12
- import { Database } from '../types/database';
13
- import {
14
- UUID,
15
- AuditEventSource,
16
- RBACAuditEvent
17
- } from './types';
18
-
19
- /**
20
- * Enhanced audit event payload for permission checks
21
- */
22
- export interface EnhancedPermissionCheckAuditEvent {
23
- type: 'permission_check';
24
- userId: UUID;
25
- organisationId: UUID;
26
- eventId?: string;
27
- appId?: UUID;
28
- pageId?: UUID;
29
- permission: string;
30
- decision: boolean;
31
- source: AuditEventSource;
32
- bypass?: boolean;
33
- duration_ms: number;
34
- metadata?: Record<string, any>;
35
- }
36
-
37
- /**
38
- * Enhanced audit event payload for permission denied
39
- */
40
- export interface EnhancedPermissionDeniedAuditEvent {
41
- type: 'permission_denied';
42
- userId: UUID;
43
- organisationId: UUID;
44
- eventId?: string;
45
- appId?: UUID;
46
- pageId?: UUID;
47
- permission: string;
48
- source: AuditEventSource;
49
- metadata?: Record<string, any>;
50
- }
51
-
52
- /**
53
- * Enhanced audit event payload for role granted
54
- */
55
- export interface EnhancedRoleGrantedAuditEvent {
56
- type: 'role_granted';
57
- userId: UUID;
58
- organisationId: UUID;
59
- eventId?: string;
60
- appId?: UUID;
61
- role: string;
62
- grantedBy: UUID;
63
- metadata?: Record<string, any>;
64
- }
65
-
66
- /**
67
- * Enhanced audit event payload for role revoked
68
- */
69
- export interface EnhancedRoleRevokedAuditEvent {
70
- type: 'role_denied';
71
- userId: UUID;
72
- organisationId: UUID;
73
- eventId?: string;
74
- appId?: UUID;
75
- role: string;
76
- revokedBy: UUID;
77
- metadata?: Record<string, any>;
78
- }
79
-
80
- /**
81
- * Enhanced audit event payload for RLS denied
82
- */
83
- export interface EnhancedRLSDeniedAuditEvent {
84
- type: 'rls_denied';
85
- userId: UUID;
86
- organisationId: UUID;
87
- table: string;
88
- operation: string;
89
- metadata?: Record<string, any>;
90
- }
91
-
92
- /**
93
- * Union type for all enhanced audit events
94
- */
95
- export type EnhancedAuditEventPayload =
96
- | EnhancedPermissionCheckAuditEvent
97
- | EnhancedPermissionDeniedAuditEvent
98
- | EnhancedRoleGrantedAuditEvent
99
- | EnhancedRoleRevokedAuditEvent
100
- | EnhancedRLSDeniedAuditEvent;
101
-
102
- /**
103
- * Enhanced RBAC Audit Manager
104
- *
105
- * Handles emission of structured audit events with better error handling
106
- * and support for both authenticated and service role contexts.
107
- */
108
- export class EnhancedRBACAuditManager {
109
- private supabase: SupabaseClient<Database>;
110
- private enabled: boolean = true;
111
- private fallbackEnabled: boolean = true;
112
-
113
- constructor(supabase: SupabaseClient<Database>) {
114
- this.supabase = supabase;
115
- }
116
-
117
- /**
118
- * Enable or disable audit logging
119
- *
120
- * @param enabled - Whether to enable audit logging
121
- */
122
- setEnabled(enabled: boolean): void {
123
- this.enabled = enabled;
124
- }
125
-
126
- /**
127
- * Enable or disable fallback logging (console logging when database fails)
128
- *
129
- * @param enabled - Whether to enable fallback logging
130
- */
131
- setFallbackEnabled(enabled: boolean): void {
132
- this.fallbackEnabled = enabled;
133
- }
134
-
135
- /**
136
- * Check if audit logging is enabled
137
- *
138
- * @returns True if audit logging is enabled
139
- */
140
- isEnabled(): boolean {
141
- return this.enabled;
142
- }
143
-
144
- /**
145
- * Emit an audit event with enhanced error handling
146
- *
147
- * @param event - Audit event payload
148
- * @returns Promise that resolves when event is logged
149
- */
150
- async emitEvent(event: EnhancedAuditEventPayload): Promise<void> {
151
- if (!this.enabled) {
152
- return;
153
- }
154
-
155
- // Validate required fields before attempting to insert
156
- if (!event.userId || !event.organisationId) {
157
- console.warn('[RBAC Audit] Skipping audit event - missing required fields:', {
158
- userId: event.userId,
159
- organisationId: event.organisationId,
160
- eventType: event.type
161
- });
162
- return;
163
- }
164
-
165
- try {
166
- // Validate pageId: only include in page_id column if it's a valid UUID
167
- // Otherwise, store it in metadata to avoid database errors
168
- const rawPageId = 'pageId' in event ? event.pageId : undefined;
169
- const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
170
- const isValidPageIdUuid = rawPageId && uuidRegex.test(rawPageId);
171
- const pageIdUuid: UUID | undefined = isValidPageIdUuid ? (rawPageId as UUID) : undefined;
172
- const pageIdName: string | undefined = rawPageId && !isValidPageIdUuid ? rawPageId : undefined;
173
-
174
- const auditEvent: Omit<RBACAuditEvent, 'id' | 'created_at'> = {
175
- event_type: event.type,
176
- user_id: event.userId,
177
- organisation_id: event.organisationId,
178
- event_id: 'eventId' in event ? event.eventId : undefined,
179
- app_id: 'appId' in event ? event.appId : undefined,
180
- page_id: pageIdUuid, // Only set if it's a valid UUID
181
- permission: 'permission' in event ? event.permission : undefined,
182
- decision: 'decision' in event ? event.decision : undefined,
183
- source: 'source' in event ? event.source : 'api', // Default to 'api' if not provided
184
- bypass: 'bypass' in event ? event.bypass : undefined,
185
- duration_ms: 'duration_ms' in event ? event.duration_ms : undefined,
186
- metadata: {
187
- ...(event.metadata || {}),
188
- // Store page name/identifier in metadata if it's not a UUID
189
- page_name: pageIdName,
190
- },
191
- };
192
-
193
- const { error } = await (this.supabase as any)
194
- .from('rbac_audit_events')
195
- .insert([auditEvent]);
196
-
197
- if (error) {
198
- // Log the error for debugging
199
- console.warn('[RBAC Audit] Failed to insert audit event:', {
200
- error: error.message,
201
- code: error.code,
202
- details: error.details,
203
- hint: error.hint,
204
- event: auditEvent
205
- });
206
-
207
- // Use fallback logging if enabled
208
- if (this.fallbackEnabled) {
209
- this.logFallbackEvent(event, error);
210
- }
211
- }
212
- } catch (error) {
213
- // Log unexpected errors
214
- console.error('[RBAC Audit] Unexpected error during audit logging:', error);
215
-
216
- // Use fallback logging if enabled
217
- if (this.fallbackEnabled) {
218
- this.logFallbackEvent(event, error);
219
- }
220
- }
221
- }
222
-
223
- /**
224
- * Log event to console as fallback when database logging fails
225
- *
226
- * @param event - Audit event payload
227
- * @param error - The error that occurred
228
- */
229
- private logFallbackEvent(event: EnhancedAuditEventPayload, error: any): void {
230
- console.log('[RBAC Audit Fallback]', {
231
- timestamp: new Date().toISOString(),
232
- event,
233
- error: error?.message || error,
234
- note: 'Database audit logging failed, using console fallback'
235
- });
236
- }
237
-
238
- /**
239
- * Emit a permission check audit event
240
- *
241
- * @param event - Permission check event data
242
- */
243
- async emitPermissionCheck(event: Omit<EnhancedPermissionCheckAuditEvent, 'type'>): Promise<void> {
244
- await this.emitEvent({
245
- type: 'permission_check',
246
- ...event,
247
- });
248
- }
249
-
250
- /**
251
- * Emit a permission denied audit event
252
- *
253
- * @param event - Permission denied event data
254
- */
255
- async emitPermissionDenied(event: Omit<EnhancedPermissionDeniedAuditEvent, 'type'>): Promise<void> {
256
- await this.emitEvent({
257
- type: 'permission_denied',
258
- ...event,
259
- });
260
- }
261
-
262
- /**
263
- * Emit a role granted audit event
264
- *
265
- * @param event - Role granted event data
266
- */
267
- async emitRoleGranted(event: Omit<EnhancedRoleGrantedAuditEvent, 'type'>): Promise<void> {
268
- await this.emitEvent({
269
- type: 'role_granted',
270
- ...event,
271
- });
272
- }
273
-
274
- /**
275
- * Emit a role revoked audit event
276
- *
277
- * @param event - Role revoked event data
278
- */
279
- async emitRoleRevoked(event: Omit<EnhancedRoleRevokedAuditEvent, 'type'>): Promise<void> {
280
- await this.emitEvent({
281
- type: 'role_denied',
282
- ...event,
283
- });
284
- }
285
-
286
- /**
287
- * Emit an RLS denied audit event
288
- *
289
- * @param event - RLS denied event data
290
- */
291
- async emitRLSDenied(event: Omit<EnhancedRLSDeniedAuditEvent, 'type'>): Promise<void> {
292
- await this.emitEvent({
293
- type: 'rls_denied',
294
- ...event,
295
- });
296
- }
297
-
298
- /**
299
- * Get audit events for a user
300
- *
301
- * @param userId - User ID
302
- * @param limit - Maximum number of events to return
303
- * @returns Promise resolving to audit events
304
- */
305
- async getUserAuditEvents(userId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {
306
- const { data, error } = await this.supabase
307
- .from('rbac_audit_events')
308
- .select('*')
309
- .eq('user_id', userId)
310
- .order('created_at', { ascending: false })
311
- .limit(limit);
312
-
313
- if (error) {
314
- throw new Error(`Failed to get audit events: ${error.message}`);
315
- }
316
-
317
- return data || [];
318
- }
319
-
320
- /**
321
- * Get audit events for an organisation
322
- *
323
- * @param organisationId - Organisation ID
324
- * @param limit - Maximum number of events to return
325
- * @returns Promise resolving to audit events
326
- */
327
- async getOrganisationAuditEvents(organisationId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {
328
- const { data, error } = await this.supabase
329
- .from('rbac_audit_events')
330
- .select('*')
331
- .eq('organisation_id', organisationId)
332
- .order('created_at', { ascending: false })
333
- .limit(limit);
334
-
335
- if (error) {
336
- throw new Error(`Failed to get audit events: ${error.message}`);
337
- }
338
-
339
- return data || [];
340
- }
341
- }
342
-
343
- /**
344
- * Create an enhanced audit manager instance
345
- *
346
- * @param supabase - Supabase client
347
- * @returns EnhancedRBACAuditManager instance
348
- */
349
- export function createEnhancedAuditManager(supabase: SupabaseClient<Database>): EnhancedRBACAuditManager {
350
- return new EnhancedRBACAuditManager(supabase);
351
- }