@jmruthers/pace-core 0.5.118 → 0.5.120

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 (181) hide show
  1. package/dist/{DataTable-ZOAKQ3SU.js → DataTable-DGZDJUYM.js} +7 -7
  2. package/dist/{UnifiedAuthProvider-YFN7YGVN.js → UnifiedAuthProvider-UACKFATV.js} +3 -3
  3. package/dist/{chunk-7OTQLFVI.js → chunk-B4GZ2BXO.js} +3 -3
  4. package/dist/{chunk-KA3PSVNV.js → chunk-BHWIUEYH.js} +2 -1
  5. package/dist/chunk-BHWIUEYH.js.map +1 -0
  6. package/dist/{chunk-LFS45U62.js → chunk-CGURJ27Z.js} +2 -2
  7. package/dist/{chunk-PHDAXDHB.js → chunk-D6BOFXYR.js} +3 -3
  8. package/dist/{chunk-P3PUOL6B.js → chunk-FKFHZUGF.js} +4 -4
  9. package/dist/{chunk-2GJ5GL77.js → chunk-GKHF54DI.js} +2 -2
  10. package/dist/chunk-GKHF54DI.js.map +1 -0
  11. package/dist/{chunk-UKZWNQMB.js → chunk-HFBOFZ3Z.js} +5 -18
  12. package/dist/chunk-HFBOFZ3Z.js.map +1 -0
  13. package/dist/{chunk-O3FTRYEU.js → chunk-NZ32EONV.js} +2 -2
  14. package/dist/{chunk-2LM4QQGH.js → chunk-QPI2CCBA.js} +9 -9
  15. package/dist/chunk-QPI2CCBA.js.map +1 -0
  16. package/dist/{chunk-ECOVPXYS.js → chunk-RIEJGKD3.js} +4 -4
  17. package/dist/{chunk-HIWXXDXO.js → chunk-TDNI6ZWL.js} +5 -5
  18. package/dist/{chunk-VN3OOE35.js → chunk-ZYJ6O5CA.js} +2 -2
  19. package/dist/components.d.ts +1 -1
  20. package/dist/components.js +9 -9
  21. package/dist/hooks.d.ts +1 -1
  22. package/dist/hooks.js +8 -8
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.js +12 -12
  25. package/dist/providers.js +2 -2
  26. package/dist/rbac/index.js +7 -7
  27. package/dist/{useToast-Cs_g32bg.d.ts → useToast-C8gR5ir4.d.ts} +2 -2
  28. package/dist/utils.js +1 -1
  29. package/docs/api/classes/ColumnFactory.md +1 -1
  30. package/docs/api/classes/ErrorBoundary.md +1 -1
  31. package/docs/api/classes/InvalidScopeError.md +1 -1
  32. package/docs/api/classes/MissingUserContextError.md +1 -1
  33. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  34. package/docs/api/classes/PermissionDeniedError.md +1 -1
  35. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  36. package/docs/api/classes/RBACAuditManager.md +1 -1
  37. package/docs/api/classes/RBACCache.md +1 -1
  38. package/docs/api/classes/RBACEngine.md +1 -1
  39. package/docs/api/classes/RBACError.md +1 -1
  40. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  41. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  42. package/docs/api/classes/StorageUtils.md +1 -1
  43. package/docs/api/enums/FileCategory.md +1 -1
  44. package/docs/api/interfaces/AggregateConfig.md +1 -1
  45. package/docs/api/interfaces/ButtonProps.md +1 -1
  46. package/docs/api/interfaces/CardProps.md +1 -1
  47. package/docs/api/interfaces/ColorPalette.md +1 -1
  48. package/docs/api/interfaces/ColorShade.md +1 -1
  49. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  50. package/docs/api/interfaces/DataRecord.md +1 -1
  51. package/docs/api/interfaces/DataTableAction.md +1 -1
  52. package/docs/api/interfaces/DataTableColumn.md +1 -1
  53. package/docs/api/interfaces/DataTableProps.md +1 -1
  54. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  55. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  56. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  57. package/docs/api/interfaces/EventAppRoleData.md +1 -1
  58. package/docs/api/interfaces/FileDisplayProps.md +1 -1
  59. package/docs/api/interfaces/FileMetadata.md +1 -1
  60. package/docs/api/interfaces/FileReference.md +1 -1
  61. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  62. package/docs/api/interfaces/FileUploadOptions.md +1 -1
  63. package/docs/api/interfaces/FileUploadProps.md +1 -1
  64. package/docs/api/interfaces/FooterProps.md +1 -1
  65. package/docs/api/interfaces/GrantEventAppRoleParams.md +1 -1
  66. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  67. package/docs/api/interfaces/InputProps.md +1 -1
  68. package/docs/api/interfaces/LabelProps.md +1 -1
  69. package/docs/api/interfaces/LoginFormProps.md +1 -1
  70. package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
  71. package/docs/api/interfaces/NavigationContextType.md +1 -1
  72. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  73. package/docs/api/interfaces/NavigationItem.md +1 -1
  74. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  75. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  76. package/docs/api/interfaces/Organisation.md +1 -1
  77. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  78. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  79. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  80. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  81. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  82. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  83. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  84. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  85. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  86. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  87. package/docs/api/interfaces/PaletteData.md +1 -1
  88. package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
  89. package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
  90. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  91. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  92. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  93. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  94. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  95. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  96. package/docs/api/interfaces/RBACConfig.md +1 -1
  97. package/docs/api/interfaces/RBACLogger.md +1 -1
  98. package/docs/api/interfaces/RevokeEventAppRoleParams.md +1 -1
  99. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  100. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  101. package/docs/api/interfaces/RoleManagementResult.md +1 -1
  102. package/docs/api/interfaces/RouteAccessRecord.md +1 -1
  103. package/docs/api/interfaces/RouteConfig.md +1 -1
  104. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  105. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  106. package/docs/api/interfaces/StorageConfig.md +1 -1
  107. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  108. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  109. package/docs/api/interfaces/StorageListOptions.md +1 -1
  110. package/docs/api/interfaces/StorageListResult.md +1 -1
  111. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  112. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  113. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  114. package/docs/api/interfaces/StyleImport.md +1 -1
  115. package/docs/api/interfaces/SwitchProps.md +1 -1
  116. package/docs/api/interfaces/ToastActionElement.md +1 -1
  117. package/docs/api/interfaces/ToastProps.md +1 -1
  118. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  119. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  120. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  121. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  122. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  123. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  124. package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
  125. package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
  126. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  127. package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
  128. package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
  129. package/docs/api/interfaces/UserEventAccess.md +1 -1
  130. package/docs/api/interfaces/UserMenuProps.md +1 -1
  131. package/docs/api/interfaces/UserProfile.md +1 -1
  132. package/docs/api/modules.md +2 -2
  133. package/package.json +1 -1
  134. package/src/components/DataTable/__tests__/DataTableCore.test.tsx +697 -0
  135. package/src/components/DataTable/components/DataTableCore.tsx +5 -0
  136. package/src/components/DataTable/components/EditableRow.tsx +9 -18
  137. package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +616 -9
  138. package/src/components/DataTable/components/__tests__/UnifiedTableBody.test.tsx +1004 -0
  139. package/src/components/DataTable/utils/__tests__/a11yUtils.test.ts +612 -0
  140. package/src/components/DataTable/utils/__tests__/errorHandling.test.ts +266 -0
  141. package/src/components/DataTable/utils/__tests__/exportUtils.test.ts +455 -1
  142. package/src/components/Toast/Toast.tsx +1 -1
  143. package/src/hooks/__tests__/index.unit.test.ts +223 -0
  144. package/src/hooks/__tests__/useDataTablePerformance.unit.test.ts +748 -0
  145. package/src/hooks/__tests__/useEvents.unit.test.ts +251 -0
  146. package/src/hooks/__tests__/useFileDisplay.unit.test.ts +1060 -0
  147. package/src/hooks/__tests__/useFileUrl.unit.test.ts +958 -0
  148. package/src/hooks/__tests__/useFocusManagement.unit.test.ts +19 -9
  149. package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +540 -1
  150. package/src/hooks/__tests__/useIsMobile.unit.test.ts +205 -5
  151. package/src/hooks/__tests__/useKeyboardShortcuts.unit.test.ts +616 -1
  152. package/src/hooks/__tests__/useOrganisations.unit.test.ts +369 -0
  153. package/src/hooks/__tests__/usePerformanceMonitor.unit.test.ts +661 -0
  154. package/src/hooks/__tests__/useSecureDataAccess.unit.test.tsx +2 -0
  155. package/src/hooks/__tests__/useSessionRestoration.unit.test.tsx +371 -0
  156. package/src/hooks/__tests__/useToast.unit.test.tsx +449 -30
  157. package/src/hooks/useSecureDataAccess.test.ts +1 -0
  158. package/src/hooks/useToast.ts +4 -4
  159. package/src/rbac/audit-enhanced.ts +339 -0
  160. package/src/services/EventService.ts +1 -0
  161. package/src/services/__tests__/AuthService.test.ts +473 -0
  162. package/src/services/__tests__/EventService.test.ts +390 -0
  163. package/src/services/__tests__/InactivityService.test.ts +217 -0
  164. package/src/services/__tests__/OrganisationService.test.ts +371 -0
  165. package/src/styles/core.css +1 -0
  166. package/dist/chunk-2GJ5GL77.js.map +0 -1
  167. package/dist/chunk-2LM4QQGH.js.map +0 -1
  168. package/dist/chunk-KA3PSVNV.js.map +0 -1
  169. package/dist/chunk-UKZWNQMB.js.map +0 -1
  170. package/src/components/DataTable/utils/debugTools.ts +0 -609
  171. package/src/rbac/testing/index.tsx +0 -340
  172. /package/dist/{DataTable-ZOAKQ3SU.js.map → DataTable-DGZDJUYM.js.map} +0 -0
  173. /package/dist/{UnifiedAuthProvider-YFN7YGVN.js.map → UnifiedAuthProvider-UACKFATV.js.map} +0 -0
  174. /package/dist/{chunk-7OTQLFVI.js.map → chunk-B4GZ2BXO.js.map} +0 -0
  175. /package/dist/{chunk-LFS45U62.js.map → chunk-CGURJ27Z.js.map} +0 -0
  176. /package/dist/{chunk-PHDAXDHB.js.map → chunk-D6BOFXYR.js.map} +0 -0
  177. /package/dist/{chunk-P3PUOL6B.js.map → chunk-FKFHZUGF.js.map} +0 -0
  178. /package/dist/{chunk-O3FTRYEU.js.map → chunk-NZ32EONV.js.map} +0 -0
  179. /package/dist/{chunk-ECOVPXYS.js.map → chunk-RIEJGKD3.js.map} +0 -0
  180. /package/dist/{chunk-HIWXXDXO.js.map → chunk-TDNI6ZWL.js.map} +0 -0
  181. /package/dist/{chunk-VN3OOE35.js.map → chunk-ZYJ6O5CA.js.map} +0 -0
@@ -0,0 +1,339 @@
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
+ const auditEvent: Omit<RBACAuditEvent, 'id' | 'created_at'> = {
167
+ event_type: event.type,
168
+ user_id: event.userId,
169
+ organisation_id: event.organisationId,
170
+ event_id: 'eventId' in event ? event.eventId : undefined,
171
+ app_id: 'appId' in event ? event.appId : undefined,
172
+ page_id: 'pageId' in event ? event.pageId : undefined,
173
+ permission: 'permission' in event ? event.permission : undefined,
174
+ decision: 'decision' in event ? event.decision : undefined,
175
+ source: 'source' in event ? event.source : 'api', // Default to 'api' if not provided
176
+ bypass: 'bypass' in event ? event.bypass : undefined,
177
+ duration_ms: 'duration_ms' in event ? event.duration_ms : undefined,
178
+ metadata: event.metadata || {},
179
+ };
180
+
181
+ const { error } = await (this.supabase as any)
182
+ .from('rbac_audit_events')
183
+ .insert([auditEvent]);
184
+
185
+ if (error) {
186
+ // Log the error for debugging
187
+ console.warn('[RBAC Audit] Failed to insert audit event:', {
188
+ error: error.message,
189
+ code: error.code,
190
+ details: error.details,
191
+ hint: error.hint,
192
+ event: auditEvent
193
+ });
194
+
195
+ // Use fallback logging if enabled
196
+ if (this.fallbackEnabled) {
197
+ this.logFallbackEvent(event, error);
198
+ }
199
+ }
200
+ } catch (error) {
201
+ // Log unexpected errors
202
+ console.error('[RBAC Audit] Unexpected error during audit logging:', error);
203
+
204
+ // Use fallback logging if enabled
205
+ if (this.fallbackEnabled) {
206
+ this.logFallbackEvent(event, error);
207
+ }
208
+ }
209
+ }
210
+
211
+ /**
212
+ * Log event to console as fallback when database logging fails
213
+ *
214
+ * @param event - Audit event payload
215
+ * @param error - The error that occurred
216
+ */
217
+ private logFallbackEvent(event: EnhancedAuditEventPayload, error: any): void {
218
+ console.log('[RBAC Audit Fallback]', {
219
+ timestamp: new Date().toISOString(),
220
+ event,
221
+ error: error?.message || error,
222
+ note: 'Database audit logging failed, using console fallback'
223
+ });
224
+ }
225
+
226
+ /**
227
+ * Emit a permission check audit event
228
+ *
229
+ * @param event - Permission check event data
230
+ */
231
+ async emitPermissionCheck(event: Omit<EnhancedPermissionCheckAuditEvent, 'type'>): Promise<void> {
232
+ await this.emitEvent({
233
+ type: 'permission_check',
234
+ ...event,
235
+ });
236
+ }
237
+
238
+ /**
239
+ * Emit a permission denied audit event
240
+ *
241
+ * @param event - Permission denied event data
242
+ */
243
+ async emitPermissionDenied(event: Omit<EnhancedPermissionDeniedAuditEvent, 'type'>): Promise<void> {
244
+ await this.emitEvent({
245
+ type: 'permission_denied',
246
+ ...event,
247
+ });
248
+ }
249
+
250
+ /**
251
+ * Emit a role granted audit event
252
+ *
253
+ * @param event - Role granted event data
254
+ */
255
+ async emitRoleGranted(event: Omit<EnhancedRoleGrantedAuditEvent, 'type'>): Promise<void> {
256
+ await this.emitEvent({
257
+ type: 'role_granted',
258
+ ...event,
259
+ });
260
+ }
261
+
262
+ /**
263
+ * Emit a role revoked audit event
264
+ *
265
+ * @param event - Role revoked event data
266
+ */
267
+ async emitRoleRevoked(event: Omit<EnhancedRoleRevokedAuditEvent, 'type'>): Promise<void> {
268
+ await this.emitEvent({
269
+ type: 'role_denied',
270
+ ...event,
271
+ });
272
+ }
273
+
274
+ /**
275
+ * Emit an RLS denied audit event
276
+ *
277
+ * @param event - RLS denied event data
278
+ */
279
+ async emitRLSDenied(event: Omit<EnhancedRLSDeniedAuditEvent, 'type'>): Promise<void> {
280
+ await this.emitEvent({
281
+ type: 'rls_denied',
282
+ ...event,
283
+ });
284
+ }
285
+
286
+ /**
287
+ * Get audit events for a user
288
+ *
289
+ * @param userId - User ID
290
+ * @param limit - Maximum number of events to return
291
+ * @returns Promise resolving to audit events
292
+ */
293
+ async getUserAuditEvents(userId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {
294
+ const { data, error } = await this.supabase
295
+ .from('rbac_audit_events')
296
+ .select('*')
297
+ .eq('user_id', userId)
298
+ .order('created_at', { ascending: false })
299
+ .limit(limit);
300
+
301
+ if (error) {
302
+ throw new Error(`Failed to get audit events: ${error.message}`);
303
+ }
304
+
305
+ return data || [];
306
+ }
307
+
308
+ /**
309
+ * Get audit events for an organisation
310
+ *
311
+ * @param organisationId - Organisation ID
312
+ * @param limit - Maximum number of events to return
313
+ * @returns Promise resolving to audit events
314
+ */
315
+ async getOrganisationAuditEvents(organisationId: UUID, limit: number = 100): Promise<RBACAuditEvent[]> {
316
+ const { data, error } = await this.supabase
317
+ .from('rbac_audit_events')
318
+ .select('*')
319
+ .eq('organisation_id', organisationId)
320
+ .order('created_at', { ascending: false })
321
+ .limit(limit);
322
+
323
+ if (error) {
324
+ throw new Error(`Failed to get audit events: ${error.message}`);
325
+ }
326
+
327
+ return data || [];
328
+ }
329
+ }
330
+
331
+ /**
332
+ * Create an enhanced audit manager instance
333
+ *
334
+ * @param supabase - Supabase client
335
+ * @returns EnhancedRBACAuditManager instance
336
+ */
337
+ export function createEnhancedAuditManager(supabase: SupabaseClient<Database>): EnhancedRBACAuditManager {
338
+ return new EnhancedRBACAuditManager(supabase);
339
+ }
@@ -372,6 +372,7 @@ export class EventService extends BaseService implements IEventService {
372
372
  id: event.event_id, // Use event_id as the primary id
373
373
  event_id: event.event_id,
374
374
  event_name: event.event_name,
375
+ event_code: event.event_code,
375
376
  event_date: event.event_date,
376
377
  event_venue: event.event_venue,
377
378
  event_participants: event.event_participants,