@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.
- package/dist/{AuthService-CVgsgtaZ.d.ts → AuthService-D4646R4b.d.ts} +9 -4
- package/dist/{DataTable-3JRLZXER.js → DataTable-ZOAKQ3SU.js} +10 -9
- package/dist/{UnifiedAuthProvider-KZZUO27W.js → UnifiedAuthProvider-YFN7YGVN.js} +4 -3
- package/dist/{api-PKU4PUBO.js → api-TNIBJWLM.js} +3 -3
- package/dist/{audit-H4YJJF7R.js → audit-T36HM7IM.js} +2 -2
- package/dist/{chunk-4OX5PXHX.js → chunk-2GJ5GL77.js} +4 -5
- package/dist/chunk-2GJ5GL77.js.map +1 -0
- package/dist/{chunk-5YIZFEUQ.js → chunk-2LM4QQGH.js} +31 -35
- package/dist/chunk-2LM4QQGH.js.map +1 -0
- package/dist/{chunk-3OGQLOJM.js → chunk-3DBFLLLU.js} +30 -1
- package/dist/chunk-3DBFLLLU.js.map +1 -0
- package/dist/{chunk-KTHLNIMA.js → chunk-ECOVPXYS.js} +13 -62
- package/dist/chunk-ECOVPXYS.js.map +1 -0
- package/dist/{chunk-OO3V7W4H.js → chunk-KA3PSVNV.js} +87 -40
- package/dist/chunk-KA3PSVNV.js.map +1 -0
- package/dist/{chunk-HKWQN44G.js → chunk-KMPWND3F.js} +15 -15
- package/dist/{chunk-L36JW4KV.js → chunk-LFS45U62.js} +2 -2
- package/dist/{chunk-NEONKMTU.js → chunk-LZYHAL7Y.js} +9 -4
- package/dist/{chunk-NEONKMTU.js.map → chunk-LZYHAL7Y.js.map} +1 -1
- package/dist/{chunk-BUN7NMV7.js → chunk-O3FTRYEU.js} +2 -2
- package/dist/{chunk-F6QB26OS.js → chunk-P3PUOL6B.js} +80 -8
- package/dist/chunk-P3PUOL6B.js.map +1 -0
- package/dist/{chunk-ZPXWJA4H.js → chunk-PHDAXDHB.js} +131 -5
- package/dist/chunk-PHDAXDHB.js.map +1 -0
- package/dist/chunk-UJI6WSMD.js +201 -0
- package/dist/{chunk-5CDJCTOO.js.map → chunk-UJI6WSMD.js.map} +1 -1
- package/dist/{chunk-JHWQNJP3.js → chunk-UKZWNQMB.js} +65 -19
- package/dist/{chunk-JHWQNJP3.js.map → chunk-UKZWNQMB.js.map} +1 -1
- package/dist/{chunk-7H75SHXZ.js → chunk-VN3OOE35.js} +2 -2
- package/dist/{chunk-QKIVSZ2O.js → chunk-WP5I5GLN.js} +2 -2
- package/dist/components.d.ts +1 -1
- package/dist/components.js +12 -11
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/hooks.js +10 -9
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +19 -16
- package/dist/index.js.map +1 -1
- package/dist/providers.d.ts +2 -2
- package/dist/providers.js +3 -2
- package/dist/rbac/index.d.ts +82 -1
- package/dist/rbac/index.js +13 -10
- package/dist/{useToast-DRah6K-g.d.ts → useToast-Cs_g32bg.d.ts} +8 -6
- package/dist/utils.js +6 -4
- package/dist/utils.js.map +1 -1
- package/dist/validation.js +3 -1
- package/dist/validation.js.map +1 -1
- package/docs/README.md +4 -0
- package/docs/api/classes/ColumnFactory.md +1 -1
- package/docs/api/classes/ErrorBoundary.md +1 -1
- package/docs/api/classes/InvalidScopeError.md +1 -1
- package/docs/api/classes/MissingUserContextError.md +1 -1
- package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
- package/docs/api/classes/PermissionDeniedError.md +1 -1
- package/docs/api/classes/PublicErrorBoundary.md +1 -1
- package/docs/api/classes/RBACAuditManager.md +35 -12
- package/docs/api/classes/RBACCache.md +1 -1
- package/docs/api/classes/RBACEngine.md +1 -1
- package/docs/api/classes/RBACError.md +1 -1
- package/docs/api/classes/RBACNotInitializedError.md +1 -1
- package/docs/api/classes/SecureSupabaseClient.md +1 -1
- package/docs/api/classes/StorageUtils.md +1 -1
- package/docs/api/enums/FileCategory.md +1 -1
- package/docs/api/interfaces/AggregateConfig.md +1 -1
- package/docs/api/interfaces/ButtonProps.md +1 -1
- package/docs/api/interfaces/CardProps.md +1 -1
- package/docs/api/interfaces/ColorPalette.md +1 -1
- package/docs/api/interfaces/ColorShade.md +1 -1
- package/docs/api/interfaces/DataAccessRecord.md +1 -1
- package/docs/api/interfaces/DataRecord.md +1 -1
- package/docs/api/interfaces/DataTableAction.md +1 -1
- package/docs/api/interfaces/DataTableColumn.md +1 -1
- package/docs/api/interfaces/DataTableProps.md +1 -1
- package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
- package/docs/api/interfaces/EmptyStateConfig.md +1 -1
- package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
- package/docs/api/interfaces/EventAppRoleData.md +71 -0
- package/docs/api/interfaces/FileDisplayProps.md +1 -1
- package/docs/api/interfaces/FileMetadata.md +1 -1
- package/docs/api/interfaces/FileReference.md +1 -1
- package/docs/api/interfaces/FileSizeLimits.md +1 -1
- package/docs/api/interfaces/FileUploadOptions.md +1 -1
- package/docs/api/interfaces/FileUploadProps.md +1 -1
- package/docs/api/interfaces/FooterProps.md +1 -1
- package/docs/api/interfaces/GrantEventAppRoleParams.md +122 -0
- package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
- package/docs/api/interfaces/InputProps.md +1 -1
- package/docs/api/interfaces/LabelProps.md +1 -1
- package/docs/api/interfaces/LoginFormProps.md +1 -1
- package/docs/api/interfaces/NavigationAccessRecord.md +1 -1
- package/docs/api/interfaces/NavigationContextType.md +1 -1
- package/docs/api/interfaces/NavigationGuardProps.md +1 -1
- package/docs/api/interfaces/NavigationItem.md +1 -1
- package/docs/api/interfaces/NavigationMenuProps.md +1 -1
- package/docs/api/interfaces/NavigationProviderProps.md +1 -1
- package/docs/api/interfaces/Organisation.md +1 -1
- package/docs/api/interfaces/OrganisationContextType.md +1 -1
- package/docs/api/interfaces/OrganisationMembership.md +1 -1
- package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
- package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
- package/docs/api/interfaces/PaceAppLayoutProps.md +27 -27
- package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
- package/docs/api/interfaces/PageAccessRecord.md +1 -1
- package/docs/api/interfaces/PagePermissionContextType.md +1 -1
- package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
- package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
- package/docs/api/interfaces/PaletteData.md +1 -1
- package/docs/api/interfaces/PermissionEnforcerProps.md +1 -1
- package/docs/api/interfaces/ProtectedRouteProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
- package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
- package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
- package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
- package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
- package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
- package/docs/api/interfaces/RBACConfig.md +1 -1
- package/docs/api/interfaces/RBACLogger.md +1 -1
- package/docs/api/interfaces/RevokeEventAppRoleParams.md +100 -0
- package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
- package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
- package/docs/api/interfaces/RoleManagementResult.md +52 -0
- package/docs/api/interfaces/RouteAccessRecord.md +1 -1
- package/docs/api/interfaces/RouteConfig.md +1 -1
- package/docs/api/interfaces/SecureDataContextType.md +1 -1
- package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
- package/docs/api/interfaces/StorageConfig.md +1 -1
- package/docs/api/interfaces/StorageFileInfo.md +1 -1
- package/docs/api/interfaces/StorageFileMetadata.md +1 -1
- package/docs/api/interfaces/StorageListOptions.md +1 -1
- package/docs/api/interfaces/StorageListResult.md +1 -1
- package/docs/api/interfaces/StorageUploadOptions.md +1 -1
- package/docs/api/interfaces/StorageUploadResult.md +1 -1
- package/docs/api/interfaces/StorageUrlOptions.md +1 -1
- package/docs/api/interfaces/StyleImport.md +1 -1
- package/docs/api/interfaces/SwitchProps.md +1 -1
- package/docs/api/interfaces/ToastActionElement.md +1 -1
- package/docs/api/interfaces/ToastProps.md +1 -1
- package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
- package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
- package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
- package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
- package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayOptions.md +1 -1
- package/docs/api/interfaces/UsePublicFileDisplayReturn.md +1 -1
- package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeOptions.md +1 -1
- package/docs/api/interfaces/UseResolvedScopeReturn.md +1 -1
- package/docs/api/interfaces/UserEventAccess.md +1 -1
- package/docs/api/interfaces/UserMenuProps.md +1 -1
- package/docs/api/interfaces/UserProfile.md +1 -1
- package/docs/api/modules.md +43 -16
- package/docs/architecture/rpc-function-standards.md +193 -0
- package/package.json +1 -1
- package/src/__tests__/TEST_STANDARD.md +244 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +46 -16
- package/src/components/DataTable/__tests__/keyboard.test.tsx +276 -217
- package/src/components/DataTable/components/DataTableCore.tsx +32 -17
- package/src/components/DataTable/components/DataTableToolbar.tsx +3 -2
- package/src/components/DataTable/components/EditableRow.tsx +18 -1
- package/src/components/DataTable/components/ImportModal.tsx +25 -2
- package/src/components/DataTable/components/ViewRowModal.tsx +1 -1
- package/src/components/DataTable/components/__tests__/AccessDeniedPage.test.tsx +735 -0
- package/src/components/DataTable/components/__tests__/BulkOperationsDropdown.test.tsx +572 -0
- package/src/components/DataTable/components/__tests__/ColumnVisibilityDropdown.test.tsx +708 -0
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +451 -0
- package/src/components/DataTable/components/__tests__/DataTableModals.test.tsx +456 -0
- package/src/components/DataTable/components/__tests__/EditableRow.test.tsx +454 -0
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +462 -0
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +423 -0
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +393 -0
- package/src/components/DataTable/components/__tests__/GroupingDropdown.test.tsx +617 -0
- package/src/components/DataTable/components/__tests__/ImportModal.test.tsx +734 -0
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +412 -0
- package/src/components/DataTable/hooks/useTableHandlers.ts +4 -0
- package/src/components/EventSelector/EventSelector.tsx +5 -25
- package/src/components/PaceAppLayout/PaceAppLayout.test.tsx +12 -7
- package/src/components/PaceAppLayout/PaceAppLayout.tsx +4 -0
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.accessibility.test.tsx +7 -2
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.integration.test.tsx +13 -8
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.performance.test.tsx +109 -100
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.security.test.tsx +18 -13
- package/src/components/PaceAppLayout/__tests__/PaceAppLayout.unit.test.tsx +17 -12
- package/src/components/PaceLoginPage/PaceLoginPage.test.tsx +2 -0
- package/src/components/PaceLoginPage/PaceLoginPage.tsx +11 -1
- package/src/components/PasswordReset/PasswordChangeForm.test.tsx +2 -2
- package/src/components/ProtectedRoute/ProtectedRoute.test.tsx +648 -0
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +10 -7
- package/src/components/PublicLayout/__tests__/PublicErrorBoundary.test.tsx +4 -12
- package/src/components/Select/Select.tsx +8 -0
- package/src/components/Toast/Toast.test.tsx +8 -7
- package/src/components/Toast/Toast.tsx +4 -4
- package/src/hooks/__tests__/usePublicEvent.simple.test.ts +367 -3
- package/src/hooks/__tests__/usePublicFileDisplay.test.ts +916 -0
- package/src/hooks/useEventTheme.ts +49 -18
- package/src/hooks/usePermissionCache.ts +5 -3
- package/src/hooks/useSecureDataAccess.ts +11 -1
- package/src/hooks/useToast.ts +11 -12
- package/src/providers/services/EventServiceProvider.tsx +15 -8
- package/src/rbac/__tests__/cache-invalidation.test.ts +385 -0
- package/src/rbac/audit.test.ts +206 -0
- package/src/rbac/audit.ts +37 -2
- package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +26 -23
- package/src/rbac/errors.test.ts +340 -0
- package/src/rbac/hooks/index.ts +9 -0
- package/src/rbac/hooks/useResolvedScope.test.ts +1063 -0
- package/src/rbac/hooks/useRoleManagement.test.ts +908 -0
- package/src/rbac/hooks/useRoleManagement.ts +255 -0
- package/src/services/AuthService.ts +10 -0
- package/src/services/EventService.ts +111 -50
- package/src/services/__tests__/AuthService.test.ts +1 -1
- package/src/services/__tests__/EventService.test.ts +60 -45
- package/src/services/interfaces/IEventService.ts +1 -1
- package/src/utils/__tests__/deviceFingerprint.unit.test.ts +320 -0
- package/src/utils/__tests__/logger.unit.test.ts +398 -0
- package/src/utils/__tests__/validation.unit.test.ts +225 -1
- package/src/utils/file-reference.test.ts +214 -0
- package/dist/chunk-3OGQLOJM.js.map +0 -1
- package/dist/chunk-4OX5PXHX.js.map +0 -1
- package/dist/chunk-5CDJCTOO.js +0 -190
- package/dist/chunk-5YIZFEUQ.js.map +0 -1
- package/dist/chunk-F6QB26OS.js.map +0 -1
- package/dist/chunk-KTHLNIMA.js.map +0 -1
- package/dist/chunk-OO3V7W4H.js.map +0 -1
- package/dist/chunk-ZPXWJA4H.js.map +0 -1
- package/src/rbac/audit-enhanced.ts +0 -351
- /package/dist/{DataTable-3JRLZXER.js.map → DataTable-ZOAKQ3SU.js.map} +0 -0
- /package/dist/{UnifiedAuthProvider-KZZUO27W.js.map → UnifiedAuthProvider-YFN7YGVN.js.map} +0 -0
- /package/dist/{api-PKU4PUBO.js.map → api-TNIBJWLM.js.map} +0 -0
- /package/dist/{audit-H4YJJF7R.js.map → audit-T36HM7IM.js.map} +0 -0
- /package/dist/{chunk-HKWQN44G.js.map → chunk-KMPWND3F.js.map} +0 -0
- /package/dist/{chunk-L36JW4KV.js.map → chunk-LFS45U62.js.map} +0 -0
- /package/dist/{chunk-BUN7NMV7.js.map → chunk-O3FTRYEU.js.map} +0 -0
- /package/dist/{chunk-7H75SHXZ.js.map → chunk-VN3OOE35.js.map} +0 -0
- /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
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|