@jmruthers/pace-core 0.5.54 → 0.5.55

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 (396) hide show
  1. package/README.md +0 -4
  2. package/dist/{DataTable-7FMFXA7A.js → DataTable-4T627QFJ.js} +11 -11
  3. package/dist/{PublicLoadingSpinner-Bq_-BeK-.d.ts → PublicLoadingSpinner-SL8WaQN7.d.ts} +2 -21
  4. package/dist/{api-H5A3H4IR.js → api-LUNF5O6M.js} +3 -3
  5. package/dist/{appConfig-BVGyuvI7.d.ts → appConfig-DjpeG6P-.d.ts} +9 -1
  6. package/dist/{appNameResolver-7GHF5ED2.js → appNameResolver-UURKN7NF.js} +2 -2
  7. package/dist/{audit-BUW3LMJB.js → audit-6TOCAMKO.js} +2 -2
  8. package/dist/{chunk-MZBUOP4P.js → chunk-5BSLGBYI.js} +4 -3
  9. package/dist/chunk-5BSLGBYI.js.map +1 -0
  10. package/dist/{chunk-I5Z3QH5X.js → chunk-66C4BSAY.js} +2 -2
  11. package/dist/{chunk-I5Z3QH5X.js.map → chunk-66C4BSAY.js.map} +1 -1
  12. package/dist/{chunk-MYP2EGHX.js → chunk-AJ2KMES7.js} +21 -14
  13. package/dist/chunk-AJ2KMES7.js.map +1 -0
  14. package/dist/{chunk-EL2O4IUX.js → chunk-AQFRLC7K.js} +16 -24
  15. package/dist/{chunk-EL2O4IUX.js.map → chunk-AQFRLC7K.js.map} +1 -1
  16. package/dist/{chunk-7BNPOCLL.js → chunk-B2WTCLCV.js} +6 -2
  17. package/dist/chunk-B2WTCLCV.js.map +1 -0
  18. package/dist/{chunk-WJARTBCT.js → chunk-D7ARGIA3.js} +16 -7
  19. package/dist/chunk-D7ARGIA3.js.map +1 -0
  20. package/dist/{chunk-NRK4AIHQ.js → chunk-KBRACSJI.js} +3 -3
  21. package/dist/{chunk-NYUJ4FJR.js → chunk-KJDPSM64.js} +7 -7
  22. package/dist/chunk-KJDPSM64.js.map +1 -0
  23. package/dist/{chunk-GWSBHC4J.js → chunk-KLPVOPRI.js} +261 -38
  24. package/dist/chunk-KLPVOPRI.js.map +1 -0
  25. package/dist/{chunk-TRIZ7IB7.js → chunk-MPQDF75X.js} +148 -288
  26. package/dist/chunk-MPQDF75X.js.map +1 -0
  27. package/dist/{chunk-MSFACPQQ.js → chunk-PAEM3OWN.js} +11 -11
  28. package/dist/{chunk-MSFACPQQ.js.map → chunk-PAEM3OWN.js.map} +1 -1
  29. package/dist/{chunk-GIO7BFE7.js → chunk-RQD3D2CO.js} +66 -169
  30. package/dist/{chunk-GIO7BFE7.js.map → chunk-RQD3D2CO.js.map} +1 -1
  31. package/dist/{chunk-YDJW5XTN.js → chunk-STT7INZR.js} +25 -1
  32. package/dist/chunk-STT7INZR.js.map +1 -0
  33. package/dist/{chunk-6MTY77WU.js → chunk-TNMXZLDR.js} +3 -3
  34. package/dist/{chunk-BC3S53OZ.js → chunk-UQE2Y64H.js} +30 -14
  35. package/dist/chunk-UQE2Y64H.js.map +1 -0
  36. package/dist/{chunk-22KLBHPS.js → chunk-W66AZIOH.js} +2 -2
  37. package/dist/chunk-W66AZIOH.js.map +1 -0
  38. package/dist/{chunk-SS3E6QLB.js → chunk-YNUBMSMV.js} +2 -2
  39. package/dist/chunk-YNUBMSMV.js.map +1 -0
  40. package/dist/{chunk-NZ655MWE.js → chunk-ZOD2ZY6X.js} +5 -4
  41. package/dist/chunk-ZOD2ZY6X.js.map +1 -0
  42. package/dist/{chunk-74C6SNEC.js → chunk-ZPK5656W.js} +3 -3
  43. package/dist/{chunk-74C6SNEC.js.map → chunk-ZPK5656W.js.map} +1 -1
  44. package/dist/components.d.ts +22 -899
  45. package/dist/components.js +436 -3118
  46. package/dist/components.js.map +1 -1
  47. package/dist/file-reference-9xUOnwyt.d.ts +70 -0
  48. package/dist/hooks.d.ts +2 -2
  49. package/dist/hooks.js +10 -10
  50. package/dist/hooks.js.map +1 -1
  51. package/dist/index.d.ts +49 -9
  52. package/dist/index.js +190 -25
  53. package/dist/index.js.map +1 -1
  54. package/dist/{organisation-CO3Sh3_D.d.ts → organisation-t-vvQC3g.d.ts} +1 -8
  55. package/dist/providers.d.ts +2 -2
  56. package/dist/providers.js +5 -5
  57. package/dist/rbac/index.d.ts +65 -46
  58. package/dist/rbac/index.js +10 -12
  59. package/dist/styles/core.css +0 -125
  60. package/dist/types.d.ts +2 -1
  61. package/dist/types.js +3 -1
  62. package/dist/types.js.map +1 -1
  63. package/dist/{usePublicRouteParams-B2OcAsur.d.ts → usePublicRouteParams-CdoFxnJK.d.ts} +1 -1
  64. package/dist/utils.d.ts +3 -4
  65. package/dist/utils.js +44 -13
  66. package/dist/utils.js.map +1 -1
  67. package/docs/FILE_REFERENCE_SYSTEM.md +440 -0
  68. package/docs/INDEX.md +7 -5
  69. package/docs/README.md +0 -1
  70. package/docs/api/README.md +0 -4
  71. package/docs/api/classes/ErrorBoundary.md +1 -1
  72. package/docs/api/classes/InvalidScopeError.md +1 -1
  73. package/docs/api/classes/MissingUserContextError.md +1 -1
  74. package/docs/api/classes/OrganisationContextRequiredError.md +1 -1
  75. package/docs/api/classes/PermissionDeniedError.md +2 -2
  76. package/docs/api/classes/PublicErrorBoundary.md +1 -1
  77. package/docs/api/classes/RBACAuditManager.md +12 -12
  78. package/docs/api/classes/RBACCache.md +1 -1
  79. package/docs/api/classes/RBACEngine.md +6 -6
  80. package/docs/api/classes/RBACError.md +1 -1
  81. package/docs/api/classes/RBACNotInitializedError.md +1 -1
  82. package/docs/api/classes/SecureSupabaseClient.md +1 -1
  83. package/docs/api/classes/StorageUtils.md +281 -0
  84. package/docs/api/interfaces/AggregateConfig.md +1 -1
  85. package/docs/api/interfaces/ButtonProps.md +1 -1
  86. package/docs/api/interfaces/CardProps.md +1 -1
  87. package/docs/api/interfaces/ColorPalette.md +1 -1
  88. package/docs/api/interfaces/ColorShade.md +1 -1
  89. package/docs/api/interfaces/DataAccessRecord.md +1 -1
  90. package/docs/api/interfaces/DataTableAction.md +1 -1
  91. package/docs/api/interfaces/DataTableColumn.md +1 -1
  92. package/docs/api/interfaces/DataTableProps.md +1 -1
  93. package/docs/api/interfaces/DataTableToolbarButton.md +1 -1
  94. package/docs/api/interfaces/EmptyStateConfig.md +1 -1
  95. package/docs/api/interfaces/EnhancedNavigationMenuProps.md +1 -1
  96. package/docs/api/interfaces/EventContextType.md +1 -1
  97. package/docs/api/interfaces/EventLogoProps.md +1 -1
  98. package/docs/api/interfaces/EventProviderProps.md +1 -1
  99. package/docs/api/interfaces/FileSizeLimits.md +1 -1
  100. package/docs/api/interfaces/FileUploadProps.md +1 -1
  101. package/docs/api/interfaces/FooterProps.md +1 -1
  102. package/docs/api/interfaces/InactivityWarningModalProps.md +1 -1
  103. package/docs/api/interfaces/InputProps.md +1 -1
  104. package/docs/api/interfaces/LabelProps.md +1 -1
  105. package/docs/api/interfaces/LoginFormProps.md +1 -1
  106. package/docs/api/interfaces/NavigationAccessRecord.md +2 -2
  107. package/docs/api/interfaces/NavigationContextType.md +1 -1
  108. package/docs/api/interfaces/NavigationGuardProps.md +1 -1
  109. package/docs/api/interfaces/NavigationItem.md +1 -1
  110. package/docs/api/interfaces/NavigationMenuProps.md +1 -1
  111. package/docs/api/interfaces/NavigationProviderProps.md +1 -1
  112. package/docs/api/interfaces/Organisation.md +1 -1
  113. package/docs/api/interfaces/OrganisationContextType.md +1 -1
  114. package/docs/api/interfaces/OrganisationMembership.md +1 -1
  115. package/docs/api/interfaces/OrganisationProviderProps.md +1 -1
  116. package/docs/api/interfaces/OrganisationSecurityError.md +1 -1
  117. package/docs/api/interfaces/PaceAppLayoutProps.md +1 -1
  118. package/docs/api/interfaces/PaceLoginPageProps.md +1 -1
  119. package/docs/api/interfaces/PageAccessRecord.md +1 -1
  120. package/docs/api/interfaces/PagePermissionContextType.md +1 -1
  121. package/docs/api/interfaces/PagePermissionGuardProps.md +1 -1
  122. package/docs/api/interfaces/PagePermissionProviderProps.md +1 -1
  123. package/docs/api/interfaces/PaletteData.md +1 -1
  124. package/docs/api/interfaces/PermissionEnforcerProps.md +4 -4
  125. package/docs/api/interfaces/PublicErrorBoundaryProps.md +1 -1
  126. package/docs/api/interfaces/PublicErrorBoundaryState.md +1 -1
  127. package/docs/api/interfaces/PublicLoadingSpinnerProps.md +1 -1
  128. package/docs/api/interfaces/PublicPageFooterProps.md +1 -1
  129. package/docs/api/interfaces/PublicPageHeaderProps.md +1 -1
  130. package/docs/api/interfaces/PublicPageLayoutProps.md +1 -1
  131. package/docs/api/interfaces/RBACConfig.md +1 -1
  132. package/docs/api/interfaces/RBACContextType.md +1 -1
  133. package/docs/api/interfaces/RBACLogger.md +1 -1
  134. package/docs/api/interfaces/RBACProviderProps.md +1 -1
  135. package/docs/api/interfaces/RoleBasedRouterContextType.md +1 -1
  136. package/docs/api/interfaces/RoleBasedRouterProps.md +1 -1
  137. package/docs/api/interfaces/RouteAccessRecord.md +2 -2
  138. package/docs/api/interfaces/RouteConfig.md +2 -2
  139. package/docs/api/interfaces/SecureDataContextType.md +1 -1
  140. package/docs/api/interfaces/SecureDataProviderProps.md +1 -1
  141. package/docs/api/interfaces/StorageConfig.md +1 -1
  142. package/docs/api/interfaces/StorageFileInfo.md +1 -1
  143. package/docs/api/interfaces/StorageFileMetadata.md +1 -1
  144. package/docs/api/interfaces/StorageListOptions.md +1 -1
  145. package/docs/api/interfaces/StorageListResult.md +1 -1
  146. package/docs/api/interfaces/StorageUploadOptions.md +1 -1
  147. package/docs/api/interfaces/StorageUploadResult.md +1 -1
  148. package/docs/api/interfaces/StorageUrlOptions.md +1 -1
  149. package/docs/api/interfaces/StyleImport.md +1 -1
  150. package/docs/api/interfaces/ToastActionElement.md +1 -1
  151. package/docs/api/interfaces/ToastProps.md +1 -1
  152. package/docs/api/interfaces/UnifiedAuthContextType.md +1 -1
  153. package/docs/api/interfaces/UnifiedAuthProviderProps.md +1 -1
  154. package/docs/api/interfaces/UseInactivityTrackerOptions.md +1 -1
  155. package/docs/api/interfaces/UseInactivityTrackerReturn.md +1 -1
  156. package/docs/api/interfaces/UsePublicEventLogoOptions.md +1 -1
  157. package/docs/api/interfaces/UsePublicEventLogoReturn.md +1 -1
  158. package/docs/api/interfaces/UsePublicEventOptions.md +1 -1
  159. package/docs/api/interfaces/UsePublicEventReturn.md +1 -1
  160. package/docs/api/interfaces/UsePublicRouteParamsReturn.md +1 -1
  161. package/docs/api/interfaces/UserEventAccess.md +1 -1
  162. package/docs/api/interfaces/UserMenuProps.md +1 -1
  163. package/docs/api/interfaces/UserProfile.md +1 -1
  164. package/docs/api/modules.md +204 -200
  165. package/docs/api-reference/components.md +141 -163
  166. package/docs/api-reference/hooks.md +347 -0
  167. package/docs/core-concepts/rbac-system.md +69 -16
  168. package/docs/getting-started/examples/basic-auth-app.md +0 -1
  169. package/docs/implementation-guides/datatable-rbac-usage.md +12 -11
  170. package/docs/implementation-guides/file-upload-storage.md +733 -0
  171. package/docs/implementation-guides/inactivity-tracking.md +779 -0
  172. package/docs/implementation-guides/organisation-security.md +748 -0
  173. package/docs/implementation-guides/public-pages-advanced.md +1022 -0
  174. package/docs/migration/MIGRATION_GUIDE.md +684 -0
  175. package/docs/migration/README.md +13 -2
  176. package/docs/migration/rbac-migration.md +73 -0
  177. package/docs/rbac/examples/rbac-rls-integration-example.md +11 -13
  178. package/docs/style-guide.md +269 -1
  179. package/package.json +1 -1
  180. package/src/__tests__/TESTING_GUIDELINES.md +331 -18
  181. package/src/__tests__/helpers/supabaseMock.ts +99 -0
  182. package/src/__tests__/rbac/PagePermissionGuard.test.tsx +10 -7
  183. package/src/__tests__/shared.ts +6 -0
  184. package/src/components/DataTable/components/ActionButtons.tsx +2 -2
  185. package/src/components/DataTable/components/DataTableCore.tsx +2 -2
  186. package/src/components/DataTable/components/UnifiedTableBody.tsx +1 -1
  187. package/src/components/DataTable/utils/debugTools.ts +2 -2
  188. package/src/components/Dialog/Dialog.test.tsx +12 -2
  189. package/src/components/ErrorBoundary/ErrorBoundary.test.tsx +6 -6
  190. package/src/components/ErrorBoundary/ErrorBoundary.tsx +2 -2
  191. package/src/components/FileDisplay.tsx +233 -0
  192. package/src/components/FileUpload.tsx +176 -0
  193. package/src/components/Footer/Footer.test.tsx +7 -7
  194. package/src/components/NavigationMenu/NavigationMenu.test.tsx +13 -6
  195. package/src/components/OrganisationSelector/OrganisationSelector.test.tsx +30 -3
  196. package/src/components/OrganisationSelector/OrganisationSelector.tsx +1 -1
  197. package/src/components/PaceAppLayout/__tests__/PaceAppLayout.rbac.test.tsx +558 -0
  198. package/src/components/PublicLayout/PublicErrorBoundary.tsx +1 -1
  199. package/src/components/PublicLayout/PublicPageDebugger.tsx +2 -2
  200. package/src/components/PublicLayout/PublicPageDiagnostic.tsx +2 -2
  201. package/src/components/PublicLayout/PublicPageProvider.tsx +2 -2
  202. package/src/components/Select/Select.test.tsx +50 -15
  203. package/src/components/SuperAdminGuard.tsx +2 -2
  204. package/src/components/__tests__/SuperAdminGuard.test.tsx +559 -0
  205. package/src/components/index.ts +0 -183
  206. package/src/hooks/__tests__/useOrganisationPermissions.unit.test.tsx +2 -2
  207. package/src/hooks/__tests__/usePermissionCache.unit.test.ts +1 -1
  208. package/src/hooks/__tests__/useRBAC.unit.test.ts +191 -138
  209. package/src/hooks/public/usePublicEvent.ts +2 -2
  210. package/src/hooks/useAppConfig.ts +3 -3
  211. package/src/hooks/useComponentPerformance.ts +1 -1
  212. package/src/hooks/useDataTablePerformance.ts +1 -1
  213. package/src/hooks/useFileReference.ts +232 -0
  214. package/src/hooks/useOrganisationPermissions.test.ts +254 -344
  215. package/src/hooks/useOrganisationPermissions.ts +15 -7
  216. package/src/hooks/useOrganisationSecurity.test.ts +390 -402
  217. package/src/hooks/usePerformanceMonitor.ts +1 -1
  218. package/src/hooks/usePermissionCache.test.ts +264 -395
  219. package/src/hooks/usePermissionCache.ts +34 -4
  220. package/src/hooks/useSecureDataAccess.test.ts +486 -0
  221. package/src/hooks/useSecureDataAccess.ts +4 -1
  222. package/src/providers/InactivityProvider.tsx +2 -2
  223. package/src/providers/OrganisationProvider.test.simple.tsx +168 -0
  224. package/src/providers/OrganisationProvider.test.tsx +168 -0
  225. package/src/providers/OrganisationProvider.tsx +18 -31
  226. package/src/providers/UnifiedAuthProvider.test.simple.tsx +205 -0
  227. package/src/providers/UnifiedAuthProvider.test.tsx +128 -0
  228. package/src/providers/__tests__/InactivityProvider.test.tsx +3 -4
  229. package/src/providers/__tests__/OrganisationProvider.test.tsx +19 -14
  230. package/src/rbac/__tests__/integration.authflow.test.tsx +123 -0
  231. package/src/rbac/__tests__/integration.navigation.test.tsx +72 -0
  232. package/src/rbac/__tests__/integration.securedata.test.tsx +92 -0
  233. package/src/rbac/__tests__/integration.smoke.test.tsx +73 -0
  234. package/src/rbac/__tests__/rbac-core.test.tsx +26 -22
  235. package/src/rbac/__tests__/rbac-engine-core-logic.test.ts +411 -0
  236. package/src/rbac/__tests__/rbac-engine-simplified.test.ts +285 -0
  237. package/src/rbac/__tests__/rbac-functions.test.ts +655 -0
  238. package/src/rbac/__tests__/rbac-integration.test.ts +532 -0
  239. package/src/rbac/__tests__/scenarios.user-role.test.tsx +196 -0
  240. package/src/rbac/api.test.ts +6 -6
  241. package/src/rbac/api.ts +2 -2
  242. package/src/rbac/audit.test.ts +485 -0
  243. package/src/rbac/audit.ts +7 -1
  244. package/src/rbac/cache-invalidation.ts +318 -0
  245. package/src/rbac/cache.test.ts +286 -0
  246. package/src/rbac/components/EnhancedNavigationMenu.test.tsx +559 -0
  247. package/src/rbac/components/EnhancedNavigationMenu.tsx +29 -23
  248. package/src/rbac/components/NavigationProvider.test.tsx +449 -0
  249. package/src/rbac/components/PagePermissionGuard.tsx +4 -4
  250. package/src/rbac/components/PagePermissionProvider.test.tsx +479 -0
  251. package/src/rbac/components/SecureDataProvider.test.tsx +511 -0
  252. package/src/rbac/components/__tests__/PagePermissionGuard.race-condition.test.tsx +159 -430
  253. package/src/rbac/components/__tests__/PagePermissionGuard.test.tsx +4 -5
  254. package/src/rbac/components/__tests__/PagePermissionGuard.verification.test.tsx +112 -118
  255. package/src/rbac/config.test.ts +410 -0
  256. package/src/rbac/engine.test.simple.ts +237 -0
  257. package/src/rbac/engine.test.ts +233 -0
  258. package/src/rbac/engine.ts +37 -41
  259. package/src/rbac/examples/CompleteRBACExample.tsx +3 -3
  260. package/src/rbac/examples/EventBasedApp.tsx +4 -4
  261. package/src/rbac/hooks/useRBAC.simple.test.ts +16 -0
  262. package/src/rbac/hooks/useRBAC.test.ts +207 -455
  263. package/src/rbac/hooks/useRBAC.ts +30 -22
  264. package/src/rbac/permissions.test.ts +128 -0
  265. package/src/rbac/permissions.ts +56 -141
  266. package/src/rbac/providers/RBACProvider.tsx +1 -1
  267. package/src/rbac/secureClient.test.ts +444 -0
  268. package/src/rbac/security.test.ts +390 -0
  269. package/src/rbac/security.ts +1 -1
  270. package/src/rbac/types.test.ts +382 -0
  271. package/src/rbac/types.ts +2 -2
  272. package/src/styles/core.css +0 -125
  273. package/src/types/file-reference.ts +77 -0
  274. package/src/types/rbac-functions.ts +290 -0
  275. package/src/types/supabase.ts +10 -28
  276. package/src/types/unified.ts +4 -1
  277. package/src/utils/__tests__/bundleAnalysis.unit.test.ts +81 -55
  278. package/src/utils/__tests__/lazyLoad.unit.test.tsx +21 -12
  279. package/src/utils/__tests__/organisationContext.unit.test.ts +13 -7
  280. package/src/utils/__tests__/performanceBudgets.unit.test.ts +3 -3
  281. package/src/utils/__tests__/sessionTracking.unit.test.ts +32 -12
  282. package/src/utils/appConfig.ts +1 -1
  283. package/src/utils/appIdResolver.test.ts +503 -0
  284. package/src/utils/appIdResolver.ts +1 -1
  285. package/src/utils/appNameResolver.test.ts +494 -0
  286. package/src/utils/appNameResolver.ts +3 -2
  287. package/src/utils/bundleAnalysis.ts +3 -3
  288. package/src/utils/debugLogger.ts +1 -1
  289. package/src/utils/file-reference.ts +263 -0
  290. package/src/utils/formatDate.test.ts +2 -2
  291. package/src/utils/organisationContext.test.ts +340 -0
  292. package/src/utils/organisationContext.ts +19 -6
  293. package/src/utils/performanceBudgets.ts +2 -2
  294. package/src/utils/permissionUtils.test.ts +393 -0
  295. package/src/utils/permissionUtils.ts +5 -2
  296. package/src/utils/secureDataAccess.test.ts +715 -0
  297. package/src/utils/secureDataAccess.ts +21 -5
  298. package/src/utils/sessionTracking.ts +34 -4
  299. package/src/utils/storage/__tests__/helpers.unit.test.ts +328 -0
  300. package/src/utils/storage/__tests__/index.unit.test.ts +16 -0
  301. package/src/utils/storage/helpers.ts +20 -25
  302. package/src/utils/storage/index.ts +29 -1
  303. package/src/vite-env.d.ts +17 -0
  304. package/dist/chunk-22KLBHPS.js.map +0 -1
  305. package/dist/chunk-7BNPOCLL.js.map +0 -1
  306. package/dist/chunk-BC3S53OZ.js.map +0 -1
  307. package/dist/chunk-GWSBHC4J.js.map +0 -1
  308. package/dist/chunk-MYP2EGHX.js.map +0 -1
  309. package/dist/chunk-MZBUOP4P.js.map +0 -1
  310. package/dist/chunk-NYUJ4FJR.js.map +0 -1
  311. package/dist/chunk-NZ655MWE.js.map +0 -1
  312. package/dist/chunk-SS3E6QLB.js.map +0 -1
  313. package/dist/chunk-TRIZ7IB7.js.map +0 -1
  314. package/dist/chunk-WJARTBCT.js.map +0 -1
  315. package/dist/chunk-YDJW5XTN.js.map +0 -1
  316. package/docs/print-components/README.md +0 -258
  317. package/docs/print-components/api-reference.md +0 -636
  318. package/docs/print-components/examples/README.md +0 -204
  319. package/docs/print-components/examples/basic-report.tsx +0 -92
  320. package/docs/print-components/examples/card-catalog.tsx +0 -149
  321. package/docs/print-components/examples/cover-page-report.tsx +0 -163
  322. package/docs/print-components/quick-start.md +0 -363
  323. package/src/components/PrintButton/PrintButton.tsx +0 -321
  324. package/src/components/PrintButton/PrintButtonGroup.tsx +0 -84
  325. package/src/components/PrintButton/PrintToolbar.tsx +0 -94
  326. package/src/components/PrintButton/__tests__/PrintButton.test.tsx +0 -271
  327. package/src/components/PrintButton/examples/PrintButtonShowcase.tsx +0 -438
  328. package/src/components/PrintButton/index.ts +0 -33
  329. package/src/components/PrintButton/types.ts +0 -173
  330. package/src/components/PrintCard/PrintCard.tsx +0 -154
  331. package/src/components/PrintCard/PrintCardContent.tsx +0 -57
  332. package/src/components/PrintCard/PrintCardFooter.tsx +0 -60
  333. package/src/components/PrintCard/PrintCardGrid.tsx +0 -91
  334. package/src/components/PrintCard/PrintCardHeader.tsx +0 -78
  335. package/src/components/PrintCard/PrintCardImage.tsx +0 -81
  336. package/src/components/PrintCard/examples/PrintCardShowcase.tsx +0 -239
  337. package/src/components/PrintCard/index.ts +0 -34
  338. package/src/components/PrintCard/types.ts +0 -171
  339. package/src/components/PrintDataTable/PrintDataTable.tsx +0 -215
  340. package/src/components/PrintDataTable/PrintTableGroup.tsx +0 -90
  341. package/src/components/PrintDataTable/PrintTableRow.tsx +0 -76
  342. package/src/components/PrintDataTable/index.ts +0 -25
  343. package/src/components/PrintDataTable/types.ts +0 -67
  344. package/src/components/PrintFooter/PrintFooter.tsx +0 -183
  345. package/src/components/PrintFooter/PrintFooterContent.tsx +0 -71
  346. package/src/components/PrintFooter/PrintFooterInfo.tsx +0 -86
  347. package/src/components/PrintFooter/PrintPageNumber.tsx +0 -90
  348. package/src/components/PrintFooter/examples/PrintFooterShowcase.tsx +0 -390
  349. package/src/components/PrintFooter/index.ts +0 -30
  350. package/src/components/PrintFooter/types.ts +0 -149
  351. package/src/components/PrintGrid/PrintGrid.tsx +0 -180
  352. package/src/components/PrintGrid/PrintGridBreakpoint.tsx +0 -109
  353. package/src/components/PrintGrid/PrintGridContainer.tsx +0 -128
  354. package/src/components/PrintGrid/PrintGridItem.tsx +0 -220
  355. package/src/components/PrintGrid/examples/PrintGridShowcase.tsx +0 -359
  356. package/src/components/PrintGrid/index.ts +0 -31
  357. package/src/components/PrintGrid/types.ts +0 -159
  358. package/src/components/PrintHeader/PrintCoverHeader.tsx +0 -230
  359. package/src/components/PrintHeader/PrintHeader.tsx +0 -150
  360. package/src/components/PrintHeader/index.ts +0 -17
  361. package/src/components/PrintHeader/types.ts +0 -42
  362. package/src/components/PrintLayout/PrintLayout.tsx +0 -122
  363. package/src/components/PrintLayout/PrintLayoutContext.tsx +0 -66
  364. package/src/components/PrintLayout/PrintPageBreak.tsx +0 -52
  365. package/src/components/PrintLayout/examples/PrintShowcase.tsx +0 -230
  366. package/src/components/PrintLayout/index.ts +0 -19
  367. package/src/components/PrintLayout/types.ts +0 -37
  368. package/src/components/PrintPageBreak/PrintPageBreak.tsx +0 -120
  369. package/src/components/PrintPageBreak/PrintPageBreakGroup.tsx +0 -90
  370. package/src/components/PrintPageBreak/PrintPageBreakIndicator.tsx +0 -112
  371. package/src/components/PrintPageBreak/examples/PrintPageBreakShowcase.tsx +0 -279
  372. package/src/components/PrintPageBreak/index.ts +0 -23
  373. package/src/components/PrintPageBreak/types.ts +0 -94
  374. package/src/components/PrintSection/PrintColumn.tsx +0 -104
  375. package/src/components/PrintSection/PrintDivider.tsx +0 -101
  376. package/src/components/PrintSection/PrintSection.tsx +0 -129
  377. package/src/components/PrintSection/PrintSectionContent.tsx +0 -75
  378. package/src/components/PrintSection/PrintSectionHeader.tsx +0 -97
  379. package/src/components/PrintSection/examples/PrintSectionShowcase.tsx +0 -258
  380. package/src/components/PrintSection/index.ts +0 -33
  381. package/src/components/PrintSection/types.ts +0 -155
  382. package/src/components/PrintText/PrintText.tsx +0 -116
  383. package/src/components/PrintText/index.ts +0 -16
  384. package/src/components/PrintText/types.ts +0 -24
  385. package/src/rbac/__tests__/integration.test.tsx +0 -218
  386. package/src/utils/print/PrintDataProcessor.ts +0 -390
  387. package/src/utils/print/examples/PrintUtilitiesShowcase.tsx +0 -397
  388. package/src/utils/print/index.ts +0 -29
  389. package/src/utils/print/types.ts +0 -196
  390. package/src/utils/print/usePrintOptimization.ts +0 -272
  391. /package/dist/{DataTable-7FMFXA7A.js.map → DataTable-4T627QFJ.js.map} +0 -0
  392. /package/dist/{api-H5A3H4IR.js.map → api-LUNF5O6M.js.map} +0 -0
  393. /package/dist/{appNameResolver-7GHF5ED2.js.map → appNameResolver-UURKN7NF.js.map} +0 -0
  394. /package/dist/{audit-BUW3LMJB.js.map → audit-6TOCAMKO.js.map} +0 -0
  395. /package/dist/{chunk-NRK4AIHQ.js.map → chunk-KBRACSJI.js.map} +0 -0
  396. /package/dist/{chunk-6MTY77WU.js.map → chunk-TNMXZLDR.js.map} +0 -0
@@ -116,26 +116,30 @@ export function useRBAC(pageId?: string): UserRBACContext {
116
116
  setError(null);
117
117
 
118
118
  try {
119
- // First resolve app name to app_id
120
- const { data: appData, error: appError } = await supabase
121
- .from('rbac_apps')
122
- .select('id')
123
- .eq('name', appName)
124
- .eq('is_active', true)
125
- .single();
119
+ // First resolve app name to app_id using secure RPC function
120
+ const { data: appData, error: appError } = await supabase.rpc('rbac_app_resolve', {
121
+ p_app_name: appName,
122
+ p_user_id: user.id
123
+ });
126
124
 
127
- if (appError || !appData) {
125
+ if (appError || !appData || appData.length === 0) {
128
126
  console.warn('App not found or inactive:', appName);
129
127
  setIsLoading(false);
130
128
  return;
131
129
  }
132
130
 
133
- const { data, error: rpcError } = await supabase.rpc('get_rbac_permissions', {
131
+ const app = appData[0];
132
+ if (!app.has_access) {
133
+ console.warn('User does not have access to app:', appName);
134
+ setIsLoading(false);
135
+ return;
136
+ }
137
+
138
+ const { data, error: rpcError } = await supabase.rpc('rbac_permissions_get', {
134
139
  p_user_id: user.id,
135
- p_app_id: appData.id,
140
+ p_app_id: app.app_id,
136
141
  p_event_id: selectedEvent?.event_id || null,
137
- p_organisation_id: selectedOrganisation?.id || null,
138
- p_page_id: pageId || null
142
+ p_organisation_id: selectedOrganisation?.id || null
139
143
  });
140
144
 
141
145
  if (rpcError) {
@@ -175,22 +179,26 @@ export function useRBAC(pageId?: string): UserRBACContext {
175
179
  }
176
180
 
177
181
  try {
178
- // First resolve app name to app_id
179
- const { data: appData, error: appError } = await supabase
180
- .from('rbac_apps')
181
- .select('id')
182
- .eq('name', appName)
183
- .eq('is_active', true)
184
- .single();
182
+ // First resolve app name to app_id using secure RPC function
183
+ const { data: appData, error: appError } = await supabase.rpc('rbac_app_resolve', {
184
+ p_app_name: appName,
185
+ p_user_id: user.id
186
+ });
185
187
 
186
- if (appError || !appData) {
188
+ if (appError || !appData || appData.length === 0) {
187
189
  console.warn('App not found or inactive:', appName);
188
190
  return false;
189
191
  }
190
192
 
191
- const { data, error } = await supabase.rpc('check_page_permission', {
193
+ const app = appData[0];
194
+ if (!app.has_access) {
195
+ console.warn('User does not have access to app:', appName);
196
+ return false;
197
+ }
198
+
199
+ const { data, error } = await supabase.rpc('rbac_page_access_check', {
192
200
  p_user_id: user.id,
193
- p_app_id: appData.id,
201
+ p_app_id: app.app_id,
194
202
  p_page_id: targetPageId || pageId || 'default',
195
203
  p_operation: operation,
196
204
  p_event_id: selectedEvent?.event_id,
@@ -0,0 +1,128 @@
1
+ /**
2
+ * @fileoverview RBAC Permissions Tests
3
+ * @package @jmruthers/pace-core
4
+ * @module RBAC/Permissions/Tests
5
+ * @since 1.0.0
6
+ *
7
+ * Tests for RBAC permission validation functions and database-driven permissions.
8
+ * Note: Hardcoded permission groups and role mappings have been removed for RBAC compliance.
9
+ */
10
+
11
+ import { describe, it, expect } from 'vitest';
12
+ import {
13
+ isValidPermission
14
+ } from './permissions';
15
+ import { Permission } from './types';
16
+
17
+ describe('RBAC Permissions', () => {
18
+ describe('Permission Validation Functions', () => {
19
+ it('validates correct CRUD permission format', () => {
20
+ expect(isValidPermission('read:users')).toBe(true);
21
+ expect(isValidPermission('create:organisation')).toBe(true);
22
+ expect(isValidPermission('update:event.content')).toBe(true);
23
+ expect(isValidPermission('delete:team.members')).toBe(true);
24
+ expect(isValidPermission('read:*')).toBe(true);
25
+ });
26
+
27
+ it('rejects invalid permission format', () => {
28
+ expect(isValidPermission('invalid')).toBe(false);
29
+ expect(isValidPermission('READ:users')).toBe(false); // uppercase not allowed
30
+ expect(isValidPermission('read:')).toBe(false);
31
+ expect(isValidPermission(':users')).toBe(false);
32
+ expect(isValidPermission('read:users*')).toBe(false); // wildcard not at end
33
+ expect(isValidPermission('read:*users')).toBe(false); // wildcard not at end
34
+ });
35
+
36
+ it('rejects manage permission (not allowed in RBAC)', () => {
37
+ expect(isValidPermission('manage:users')).toBe(false);
38
+ expect(isValidPermission('manage:*')).toBe(false);
39
+ expect(isValidPermission('manage:organisation')).toBe(false);
40
+ });
41
+
42
+ it('validates resource naming conventions', () => {
43
+ // Valid resource names
44
+ expect(isValidPermission('read:users')).toBe(true);
45
+ expect(isValidPermission('create:event.content')).toBe(true);
46
+ expect(isValidPermission('update:team.members')).toBe(true);
47
+ expect(isValidPermission('delete:organisation.settings')).toBe(true);
48
+
49
+ // Invalid resource names
50
+ expect(isValidPermission('read:Users')).toBe(false); // uppercase
51
+ expect(isValidPermission('read:user-settings')).toBe(false); // hyphen not allowed
52
+ expect(isValidPermission('read:user_settings')).toBe(false); // underscore not allowed
53
+ expect(isValidPermission('read:user.settings.')).toBe(false); // trailing dot
54
+ });
55
+
56
+ it('validates wildcard permissions', () => {
57
+ expect(isValidPermission('read:*')).toBe(true);
58
+ expect(isValidPermission('create:*')).toBe(true);
59
+ expect(isValidPermission('update:*')).toBe(true);
60
+ expect(isValidPermission('delete:*')).toBe(true);
61
+
62
+ // Invalid wildcard usage
63
+ expect(isValidPermission('*:users')).toBe(false);
64
+ expect(isValidPermission('read:*users')).toBe(false);
65
+ expect(isValidPermission('read:users*')).toBe(false);
66
+ });
67
+ });
68
+
69
+ describe('Type Safety', () => {
70
+ it('validates Permission type structure', () => {
71
+ const validPermissions: Permission[] = [
72
+ 'read:users',
73
+ 'create:organisation',
74
+ 'update:event.content',
75
+ 'delete:team.members',
76
+ 'read:*'
77
+ ];
78
+
79
+ validPermissions.forEach(permission => {
80
+ expect(typeof permission).toBe('string');
81
+ expect(isValidPermission(permission)).toBe(true);
82
+ });
83
+ });
84
+
85
+ it('rejects invalid Permission types', () => {
86
+ const invalidPermissions = [
87
+ 'manage:users',
88
+ 'READ:users',
89
+ 'read:',
90
+ ':users',
91
+ 'read:users*',
92
+ 'read:*users',
93
+ 'invalid'
94
+ ];
95
+
96
+ invalidPermissions.forEach(permission => {
97
+ expect(isValidPermission(permission)).toBe(false);
98
+ });
99
+ });
100
+ });
101
+
102
+ describe('RBAC Compliance', () => {
103
+ it('only allows CRUD operations', () => {
104
+ const validOperations = ['read', 'create', 'update', 'delete'];
105
+ const invalidOperations = ['manage', 'admin', 'execute', 'view'];
106
+
107
+ validOperations.forEach(operation => {
108
+ expect(isValidPermission(`${operation}:users`)).toBe(true);
109
+ });
110
+
111
+ invalidOperations.forEach(operation => {
112
+ expect(isValidPermission(`${operation}:users`)).toBe(false);
113
+ });
114
+ });
115
+
116
+ it('enforces lowercase resource names', () => {
117
+ expect(isValidPermission('read:users')).toBe(true);
118
+ expect(isValidPermission('read:Users')).toBe(false);
119
+ expect(isValidPermission('read:USERS')).toBe(false);
120
+ });
121
+
122
+ it('allows dot notation for hierarchical resources', () => {
123
+ expect(isValidPermission('read:event.content')).toBe(true);
124
+ expect(isValidPermission('update:team.members')).toBe(true);
125
+ expect(isValidPermission('create:organisation.settings')).toBe(true);
126
+ });
127
+ });
128
+ });
@@ -15,7 +15,6 @@ import { Permission } from './types';
15
15
  // ============================================================================
16
16
 
17
17
  export const GLOBAL_PERMISSIONS = {
18
- MANAGE_ALL: 'manage:*' as Permission,
19
18
  READ_ALL: 'read:*' as Permission,
20
19
  CREATE_ALL: 'create:*' as Permission,
21
20
  UPDATE_ALL: 'update:*' as Permission,
@@ -28,33 +27,29 @@ export const GLOBAL_PERMISSIONS = {
28
27
 
29
28
  export const ORGANISATION_PERMISSIONS = {
30
29
  // Organisation management
31
- MANAGE_ORGANISATION: 'manage:organisation' as Permission,
32
30
  READ_ORGANISATION: 'read:organisation' as Permission,
33
31
  UPDATE_ORGANISATION: 'update:organisation' as Permission,
32
+ DELETE_ORGANISATION: 'delete:organisation' as Permission,
34
33
 
35
34
  // User management
36
- MANAGE_USERS: 'manage:users' as Permission,
37
35
  READ_USERS: 'read:users' as Permission,
38
36
  CREATE_USERS: 'create:users' as Permission,
39
37
  UPDATE_USERS: 'update:users' as Permission,
40
38
  DELETE_USERS: 'delete:users' as Permission,
41
39
 
42
40
  // Role management
43
- MANAGE_ROLES: 'manage:roles' as Permission,
44
41
  READ_ROLES: 'read:roles' as Permission,
45
42
  CREATE_ROLES: 'create:roles' as Permission,
46
43
  UPDATE_ROLES: 'update:roles' as Permission,
47
44
  DELETE_ROLES: 'delete:roles' as Permission,
48
45
 
49
46
  // Event management
50
- MANAGE_EVENTS: 'manage:events' as Permission,
51
47
  READ_EVENTS: 'read:events' as Permission,
52
48
  CREATE_EVENTS: 'create:events' as Permission,
53
49
  UPDATE_EVENTS: 'update:events' as Permission,
54
50
  DELETE_EVENTS: 'delete:events' as Permission,
55
51
 
56
52
  // App management
57
- MANAGE_APPS: 'manage:apps' as Permission,
58
53
  READ_APPS: 'read:apps' as Permission,
59
54
  CREATE_APPS: 'create:apps' as Permission,
60
55
  UPDATE_APPS: 'update:apps' as Permission,
@@ -67,40 +62,40 @@ export const ORGANISATION_PERMISSIONS = {
67
62
 
68
63
  export const EVENT_APP_PERMISSIONS = {
69
64
  // Event management
70
- MANAGE_EVENT: 'manage:event' as Permission,
71
65
  READ_EVENT: 'read:event' as Permission,
66
+ CREATE_EVENT: 'create:event' as Permission,
72
67
  UPDATE_EVENT: 'update:event' as Permission,
68
+ DELETE_EVENT: 'delete:event' as Permission,
73
69
 
74
70
  // App management
75
- MANAGE_APP: 'manage:app' as Permission,
76
71
  READ_APP: 'read:app' as Permission,
72
+ CREATE_APP: 'create:app' as Permission,
77
73
  UPDATE_APP: 'update:app' as Permission,
74
+ DELETE_APP: 'delete:app' as Permission,
78
75
 
79
76
  // Team management
80
- MANAGE_TEAM: 'manage:team' as Permission,
81
77
  READ_TEAM: 'read:team' as Permission,
82
78
  CREATE_TEAM: 'create:team' as Permission,
83
79
  UPDATE_TEAM: 'update:team' as Permission,
84
80
  DELETE_TEAM: 'delete:team' as Permission,
85
81
 
86
82
  // Team members
87
- MANAGE_TEAM_MEMBERS: 'manage:team.members' as Permission,
88
83
  READ_TEAM_MEMBERS: 'read:team.members' as Permission,
89
84
  CREATE_TEAM_MEMBERS: 'create:team.members' as Permission,
90
85
  UPDATE_TEAM_MEMBERS: 'update:team.members' as Permission,
91
86
  DELETE_TEAM_MEMBERS: 'delete:team.members' as Permission,
92
87
 
93
88
  // Event content
94
- MANAGE_EVENT_CONTENT: 'manage:event.content' as Permission,
95
89
  READ_EVENT_CONTENT: 'read:event.content' as Permission,
96
90
  CREATE_EVENT_CONTENT: 'create:event.content' as Permission,
97
91
  UPDATE_EVENT_CONTENT: 'update:event.content' as Permission,
98
92
  DELETE_EVENT_CONTENT: 'delete:event.content' as Permission,
99
93
 
100
94
  // Event settings
101
- MANAGE_EVENT_SETTINGS: 'manage:event.settings' as Permission,
102
95
  READ_EVENT_SETTINGS: 'read:event.settings' as Permission,
96
+ CREATE_EVENT_SETTINGS: 'create:event.settings' as Permission,
103
97
  UPDATE_EVENT_SETTINGS: 'update:event.settings' as Permission,
98
+ DELETE_EVENT_SETTINGS: 'delete:event.settings' as Permission,
104
99
  } as const;
105
100
 
106
101
  // ============================================================================
@@ -110,131 +105,43 @@ export const EVENT_APP_PERMISSIONS = {
110
105
  export const PAGE_PERMISSIONS = {
111
106
  // General page access
112
107
  READ_PAGE: 'read:page' as Permission,
113
- MANAGE_PAGE: 'manage:page' as Permission,
108
+ CREATE_PAGE: 'create:page' as Permission,
109
+ UPDATE_PAGE: 'update:page' as Permission,
110
+ DELETE_PAGE: 'delete:page' as Permission,
114
111
 
115
112
  // Admin pages
116
113
  READ_ADMIN: 'read:admin' as Permission,
117
- MANAGE_ADMIN: 'manage:admin' as Permission,
114
+ CREATE_ADMIN: 'create:admin' as Permission,
115
+ UPDATE_ADMIN: 'update:admin' as Permission,
116
+ DELETE_ADMIN: 'delete:admin' as Permission,
118
117
 
119
118
  // Dashboard pages
120
119
  READ_DASHBOARD: 'read:dashboard' as Permission,
121
- MANAGE_DASHBOARD: 'manage:dashboard' as Permission,
120
+ CREATE_DASHBOARD: 'create:dashboard' as Permission,
121
+ UPDATE_DASHBOARD: 'update:dashboard' as Permission,
122
+ DELETE_DASHBOARD: 'delete:dashboard' as Permission,
122
123
 
123
124
  // Settings pages
124
125
  READ_SETTINGS: 'read:settings' as Permission,
125
- MANAGE_SETTINGS: 'manage:settings' as Permission,
126
+ CREATE_SETTINGS: 'create:settings' as Permission,
127
+ UPDATE_SETTINGS: 'update:settings' as Permission,
128
+ DELETE_SETTINGS: 'delete:settings' as Permission,
126
129
 
127
130
  // Reports pages
128
131
  READ_REPORTS: 'read:reports' as Permission,
129
- MANAGE_REPORTS: 'manage:reports' as Permission,
132
+ CREATE_REPORTS: 'create:reports' as Permission,
133
+ UPDATE_REPORTS: 'update:reports' as Permission,
134
+ DELETE_REPORTS: 'delete:reports' as Permission,
130
135
  } as const;
131
136
 
132
137
  // ============================================================================
133
- // PERMISSION GROUPS
138
+ // PERMISSION GROUPS - REMOVED
134
139
  // ============================================================================
135
-
136
- export const PERMISSION_GROUPS = {
137
- // Global admin permissions
138
- GLOBAL_ADMIN: [
139
- GLOBAL_PERMISSIONS.MANAGE_ALL,
140
- GLOBAL_PERMISSIONS.READ_ALL,
141
- GLOBAL_PERMISSIONS.CREATE_ALL,
142
- GLOBAL_PERMISSIONS.UPDATE_ALL,
143
- GLOBAL_PERMISSIONS.DELETE_ALL,
144
- ],
145
-
146
- // Organisation admin permissions
147
- ORG_ADMIN: [
148
- ORGANISATION_PERMISSIONS.MANAGE_ORGANISATION,
149
- ORGANISATION_PERMISSIONS.READ_ORGANISATION,
150
- ORGANISATION_PERMISSIONS.UPDATE_ORGANISATION,
151
- ORGANISATION_PERMISSIONS.MANAGE_USERS,
152
- ORGANISATION_PERMISSIONS.READ_USERS,
153
- ORGANISATION_PERMISSIONS.CREATE_USERS,
154
- ORGANISATION_PERMISSIONS.UPDATE_USERS,
155
- ORGANISATION_PERMISSIONS.DELETE_USERS,
156
- ORGANISATION_PERMISSIONS.MANAGE_ROLES,
157
- ORGANISATION_PERMISSIONS.READ_ROLES,
158
- ORGANISATION_PERMISSIONS.CREATE_ROLES,
159
- ORGANISATION_PERMISSIONS.UPDATE_ROLES,
160
- ORGANISATION_PERMISSIONS.DELETE_ROLES,
161
- ORGANISATION_PERMISSIONS.MANAGE_EVENTS,
162
- ORGANISATION_PERMISSIONS.READ_EVENTS,
163
- ORGANISATION_PERMISSIONS.CREATE_EVENTS,
164
- ORGANISATION_PERMISSIONS.UPDATE_EVENTS,
165
- ORGANISATION_PERMISSIONS.DELETE_EVENTS,
166
- ORGANISATION_PERMISSIONS.MANAGE_APPS,
167
- ORGANISATION_PERMISSIONS.READ_APPS,
168
- ORGANISATION_PERMISSIONS.CREATE_APPS,
169
- ORGANISATION_PERMISSIONS.UPDATE_APPS,
170
- ORGANISATION_PERMISSIONS.DELETE_APPS,
171
- ],
172
-
173
- // Event admin permissions
174
- EVENT_ADMIN: [
175
- EVENT_APP_PERMISSIONS.MANAGE_EVENT,
176
- EVENT_APP_PERMISSIONS.READ_EVENT,
177
- EVENT_APP_PERMISSIONS.UPDATE_EVENT,
178
- EVENT_APP_PERMISSIONS.MANAGE_APP,
179
- EVENT_APP_PERMISSIONS.READ_APP,
180
- EVENT_APP_PERMISSIONS.UPDATE_APP,
181
- EVENT_APP_PERMISSIONS.MANAGE_TEAM,
182
- EVENT_APP_PERMISSIONS.READ_TEAM,
183
- EVENT_APP_PERMISSIONS.CREATE_TEAM,
184
- EVENT_APP_PERMISSIONS.UPDATE_TEAM,
185
- EVENT_APP_PERMISSIONS.DELETE_TEAM,
186
- EVENT_APP_PERMISSIONS.MANAGE_TEAM_MEMBERS,
187
- EVENT_APP_PERMISSIONS.READ_TEAM_MEMBERS,
188
- EVENT_APP_PERMISSIONS.CREATE_TEAM_MEMBERS,
189
- EVENT_APP_PERMISSIONS.UPDATE_TEAM_MEMBERS,
190
- EVENT_APP_PERMISSIONS.DELETE_TEAM_MEMBERS,
191
- EVENT_APP_PERMISSIONS.MANAGE_EVENT_CONTENT,
192
- EVENT_APP_PERMISSIONS.READ_EVENT_CONTENT,
193
- EVENT_APP_PERMISSIONS.CREATE_EVENT_CONTENT,
194
- EVENT_APP_PERMISSIONS.UPDATE_EVENT_CONTENT,
195
- EVENT_APP_PERMISSIONS.DELETE_EVENT_CONTENT,
196
- EVENT_APP_PERMISSIONS.MANAGE_EVENT_SETTINGS,
197
- EVENT_APP_PERMISSIONS.READ_EVENT_SETTINGS,
198
- EVENT_APP_PERMISSIONS.UPDATE_EVENT_SETTINGS,
199
- ],
200
-
201
- // Planner permissions
202
- PLANNER: [
203
- EVENT_APP_PERMISSIONS.READ_EVENT,
204
- EVENT_APP_PERMISSIONS.UPDATE_EVENT,
205
- EVENT_APP_PERMISSIONS.READ_APP,
206
- EVENT_APP_PERMISSIONS.UPDATE_APP,
207
- EVENT_APP_PERMISSIONS.READ_TEAM,
208
- EVENT_APP_PERMISSIONS.CREATE_TEAM,
209
- EVENT_APP_PERMISSIONS.UPDATE_TEAM,
210
- EVENT_APP_PERMISSIONS.READ_TEAM_MEMBERS,
211
- EVENT_APP_PERMISSIONS.CREATE_TEAM_MEMBERS,
212
- EVENT_APP_PERMISSIONS.UPDATE_TEAM_MEMBERS,
213
- EVENT_APP_PERMISSIONS.READ_EVENT_CONTENT,
214
- EVENT_APP_PERMISSIONS.CREATE_EVENT_CONTENT,
215
- EVENT_APP_PERMISSIONS.UPDATE_EVENT_CONTENT,
216
- EVENT_APP_PERMISSIONS.READ_EVENT_SETTINGS,
217
- EVENT_APP_PERMISSIONS.UPDATE_EVENT_SETTINGS,
218
- ],
219
-
220
- // Participant permissions
221
- PARTICIPANT: [
222
- EVENT_APP_PERMISSIONS.READ_EVENT,
223
- EVENT_APP_PERMISSIONS.READ_APP,
224
- EVENT_APP_PERMISSIONS.READ_TEAM,
225
- EVENT_APP_PERMISSIONS.READ_TEAM_MEMBERS,
226
- EVENT_APP_PERMISSIONS.READ_EVENT_CONTENT,
227
- EVENT_APP_PERMISSIONS.READ_EVENT_SETTINGS,
228
- ],
229
-
230
- // Viewer permissions
231
- VIEWER: [
232
- EVENT_APP_PERMISSIONS.READ_EVENT,
233
- EVENT_APP_PERMISSIONS.READ_APP,
234
- EVENT_APP_PERMISSIONS.READ_TEAM,
235
- EVENT_APP_PERMISSIONS.READ_EVENT_CONTENT,
236
- ],
237
- } as const;
140
+ // NOTE: Hardcoded permission groups have been removed to ensure RBAC compliance.
141
+ // Permissions must be queried from the rbac_page_permissions database table.
142
+ // This ensures organizations can customize their own page-level permissions.
143
+ // The permission string constants above can still be used for TypeScript
144
+ // type safety and autocomplete, but actual permission grants come from the database.
238
145
 
239
146
  // ============================================================================
240
147
  // PERMISSION VALIDATION
@@ -247,36 +154,44 @@ export const PERMISSION_GROUPS = {
247
154
  * @returns True if valid, false otherwise
248
155
  */
249
156
  export function isValidPermission(permission: string): permission is Permission {
250
- // Allow wildcard only at the end: manage:* or read:events
157
+ // Allow wildcard only at the end: read:* or read:events
251
158
  // But not: read:events* or read:*events
252
159
  // Also reject uppercase operations and resource names
253
- const pattern = /^(read|create|update|delete|manage):[a-z0-9._-]+$|^(read|create|update|delete|manage):\*$/;
160
+ // NOTE: Only CRUD operations are allowed (read, create, update, delete)
161
+ // Resource names must be lowercase letters, numbers, and dots only
162
+ // Cannot start or end with dots, cannot have consecutive dots
163
+ const pattern = /^(read|create|update|delete):[a-z0-9]+(\.[a-z0-9]+)*$|^(read|create|update|delete):\*$/;
254
164
  return pattern.test(permission);
255
165
  }
256
166
 
257
167
  /**
258
- * Get all permissions for a role
168
+ * Get all permissions for a role - REMOVED
169
+ *
170
+ * @deprecated This function has been removed to ensure RBAC compliance.
171
+ * Permissions must be queried from the rbac_page_permissions database table,
172
+ * not hardcoded in application code. This allows organizations to customize
173
+ * their own page-level permissions as required by the RBAC specification.
174
+ *
175
+ * To get permissions for a role, query the database:
176
+ * ```typescript
177
+ * const { data } = await supabase
178
+ * .from('rbac_page_permissions')
179
+ * .select('operation, allowed')
180
+ * .eq('role_name', roleName)
181
+ * .eq('organisation_id', organisationId)
182
+ * .eq('allowed', true);
183
+ * ```
259
184
  *
260
185
  * @param role - Role name
261
- * @returns Array of permissions for the role
186
+ * @returns Empty array (function deprecated)
262
187
  */
263
188
  export function getPermissionsForRole(role: string): Permission[] {
264
- switch (role) {
265
- case 'super_admin':
266
- return [...PERMISSION_GROUPS.GLOBAL_ADMIN];
267
- case 'org_admin':
268
- return [...PERMISSION_GROUPS.ORG_ADMIN];
269
- case 'event_admin':
270
- return [...PERMISSION_GROUPS.EVENT_ADMIN];
271
- case 'planner':
272
- return [...PERMISSION_GROUPS.PLANNER];
273
- case 'participant':
274
- return [...PERMISSION_GROUPS.PARTICIPANT];
275
- case 'viewer':
276
- return [...PERMISSION_GROUPS.VIEWER];
277
- default:
278
- return [];
279
- }
189
+ console.warn(
190
+ '[RBAC] getPermissionsForRole() is deprecated. ' +
191
+ 'Permissions must be queried from rbac_page_permissions table. ' +
192
+ `Called with role: ${role}`
193
+ );
194
+ return [];
280
195
  }
281
196
 
282
197
  // ============================================================================
@@ -388,7 +388,7 @@ export function RBACProvider({
388
388
  return;
389
389
  }
390
390
 
391
- const { data, error } = await supabaseClient.rpc('get_rbac_permissions', {
391
+ const { data, error } = await supabaseClient.rpc('rbac_permissions_get', {
392
392
  p_user_id: user.id,
393
393
  p_app_id: appData.id,
394
394
  p_event_id: eventId || null,