@jmruthers/pace-core 0.6.6 → 0.6.7
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/{scripts/audit/audit-dependencies.cjs → audit-tool/00-dependencies.cjs} +12 -13
- package/audit-tool/audits/01-pace-core-compliance.cjs +556 -0
- package/audit-tool/audits/02-project-structure.cjs +255 -0
- package/audit-tool/audits/03-architecture.cjs +196 -0
- package/audit-tool/audits/04-code-quality.cjs +149 -0
- package/audit-tool/audits/05-styling.cjs +224 -0
- package/audit-tool/audits/06-security-rbac.cjs +544 -0
- package/audit-tool/audits/07-api-tech-stack.cjs +301 -0
- package/audit-tool/audits/08-testing-documentation.cjs +202 -0
- package/audit-tool/audits/09-operations.cjs +208 -0
- package/audit-tool/index.cjs +291 -0
- package/audit-tool/utils/code-utils.cjs +218 -0
- package/audit-tool/utils/file-utils.cjs +230 -0
- package/audit-tool/utils/report-utils.cjs +241 -0
- package/cursor-rules/00-standards-overview.mdc +156 -0
- package/cursor-rules/{00-pace-core-compliance.mdc → 01-pace-core-compliance.mdc} +187 -34
- package/cursor-rules/02-project-structure.mdc +37 -5
- package/cursor-rules/{03-solid-principles.mdc → 03-architecture.mdc} +125 -11
- package/cursor-rules/04-code-quality.mdc +419 -0
- package/cursor-rules/{08-markup-quality.mdc → 05-styling.mdc} +55 -10
- package/cursor-rules/{09-rbac-compliance.mdc → 06-security-rbac.mdc} +62 -6
- package/cursor-rules/07-api-tech-stack.mdc +377 -0
- package/cursor-rules/08-testing-documentation.mdc +324 -0
- package/cursor-rules/09-operations.mdc +365 -0
- package/dist/DataTable-7PMH7XN7.js +15 -0
- package/dist/{DataTable-2N_tqbfq.d.ts → DataTable-DRUIgtUH.d.ts} +1 -1
- package/dist/{PublicPageProvider-BBH6Vqg7.d.ts → PublicPageProvider-DlsCaR5v.d.ts} +26 -16
- package/dist/{chunk-FENMYN2U.js → chunk-5X4QLXRG.js} +1 -3
- package/dist/{chunk-4T7OBVTU.js → chunk-6F3IILHI.js} +1 -1
- package/dist/{chunk-SD6WQY43.js → chunk-7ILTDCL2.js} +9 -1
- package/dist/{chunk-3QC3KRHK.js → chunk-A3W6LW53.js} +16 -1
- package/dist/{chunk-7TYHROIV.js → chunk-BM4CQ5P3.js} +50 -8
- package/dist/{chunk-2HGJFNAH.js → chunk-FEJLJNWA.js} +1 -15
- package/dist/{chunk-OHIK3MIO.js → chunk-GHYHJTYV.js} +2 -2
- package/dist/{chunk-UIYSCEV7.js → chunk-IUBRCBSY.js} +1 -1
- package/dist/{chunk-LAZMKTTF.js → chunk-JGWDVX64.js} +281 -347
- package/dist/{chunk-MAGBIDNS.js → chunk-L4XMVJKY.js} +2 -2
- package/dist/{chunk-A55DK444.js → chunk-OJ4SKRSV.js} +1 -7
- package/dist/{chunk-ZS5VO5JB.js → chunk-Q7Q7V5NV.js} +406 -451
- package/dist/{chunk-3O3WHILE.js → chunk-VBCS3DUA.js} +236 -60
- package/dist/{chunk-BVP2BCJF.js → chunk-ZKAWKYT4.js} +8 -8
- package/dist/components.d.ts +5 -4
- package/dist/components.js +27 -32
- package/dist/eslint-rules/index.cjs +22 -9
- package/{src/eslint-rules/rules/compliance.cjs → dist/eslint-rules/rules/01-pace-core-compliance.cjs} +184 -23
- package/dist/eslint-rules/rules/04-code-quality.cjs +290 -0
- package/dist/eslint-rules/rules/05-styling.cjs +61 -0
- package/dist/eslint-rules/rules/{rbac.cjs → 06-security-rbac.cjs} +26 -10
- package/dist/eslint-rules/rules/07-api-tech-stack.cjs +263 -0
- package/dist/eslint-rules/rules/08-testing.cjs +94 -0
- package/dist/hooks.d.ts +5 -5
- package/dist/hooks.js +6 -6
- package/dist/index.d.ts +6 -6
- package/dist/index.js +18 -17
- package/dist/rbac/index.js +6 -6
- package/dist/theming/runtime.d.ts +14 -1
- package/dist/theming/runtime.js +1 -1
- package/dist/{types-B-K_5VnO.d.ts → types-DXstZpNI.d.ts} +0 -17
- package/dist/{usePublicRouteParams-COZ28Mvq.d.ts → usePublicRouteParams-MamNgwqe.d.ts} +19 -19
- package/dist/utils.d.ts +2 -2
- package/dist/utils.js +8 -8
- package/docs/README.md +1 -1
- package/docs/api/modules.md +47 -31
- package/docs/api-reference/components.md +18 -20
- package/docs/api-reference/hooks.md +80 -80
- package/docs/api-reference/types.md +1 -1
- package/docs/api-reference/utilities.md +1 -1
- package/docs/architecture/README.md +1 -1
- package/docs/core-concepts/events.md +3 -3
- package/docs/core-concepts/organisations.md +6 -6
- package/docs/core-concepts/permissions.md +6 -6
- package/docs/documentation-index.md +12 -18
- package/docs/getting-started/documentation-index.md +1 -1
- package/docs/getting-started/examples/README.md +4 -4
- package/docs/getting-started/examples/full-featured-app.md +1 -1
- package/docs/getting-started/faq.md +2 -2
- package/docs/getting-started/quick-reference.md +4 -4
- package/docs/implementation-guides/authentication.md +15 -15
- package/docs/implementation-guides/component-styling.md +1 -1
- package/docs/implementation-guides/data-tables.md +126 -33
- package/docs/implementation-guides/datatable-rbac-usage.md +1 -1
- package/docs/implementation-guides/dynamic-colors.md +3 -3
- package/docs/implementation-guides/file-upload-storage.md +2 -2
- package/docs/implementation-guides/hierarchical-datatable.md +40 -60
- package/docs/implementation-guides/inactivity-tracking.md +3 -3
- package/docs/implementation-guides/large-datasets.md +3 -2
- package/docs/implementation-guides/organisation-security.md +2 -2
- package/docs/implementation-guides/performance.md +2 -2
- package/docs/implementation-guides/permission-enforcement.md +1 -1
- package/docs/migration/V0.3.44_organisation-context-timing-fix.md +1 -1
- package/docs/migration/V0.4.0_rbac-migration.md +6 -6
- package/docs/rbac/README.md +5 -5
- package/docs/rbac/advanced-patterns.md +6 -6
- package/docs/rbac/api-reference.md +20 -20
- package/docs/rbac/event-based-apps.md +3 -3
- package/docs/rbac/examples.md +41 -41
- package/docs/rbac/getting-started.md +37 -37
- package/docs/rbac/performance.md +1 -1
- package/docs/rbac/quick-start.md +52 -52
- package/docs/rbac/secure-client-protection.md +1 -1
- package/docs/rbac/troubleshooting.md +1 -1
- package/docs/security/README.md +5 -5
- package/docs/standards/0-standards-overview.md +220 -0
- package/docs/standards/{00-pace-core-compliance.md → 1-pace-core-compliance-standards.md} +204 -185
- package/docs/standards/{02-project-structure.md → 2-project-structure-standards.md} +11 -47
- package/docs/standards/3-architecture-standards.md +606 -0
- package/docs/standards/4-code-quality-standards.md +728 -0
- package/docs/standards/{08-markup-quality.md → 5-styling-standards.md} +12 -9
- package/docs/standards/{09-rbac-compliance.md → 6-security-rbac-standards.md} +126 -18
- package/docs/standards/7-api-tech-stack-standards.md +662 -0
- package/docs/standards/8-testing-documentation-standards.md +401 -0
- package/docs/standards/9-operations-standards.md +1102 -0
- package/docs/standards/README.md +203 -104
- package/docs/troubleshooting/README.md +4 -4
- package/docs/troubleshooting/common-issues.md +2 -2
- package/docs/troubleshooting/debugging.md +9 -9
- package/docs/troubleshooting/migration.md +4 -4
- package/eslint-config-pace-core.cjs +21 -10
- package/package.json +6 -5
- package/scripts/install-cursor-rules.cjs +11 -243
- package/scripts/install-eslint-config.cjs +284 -0
- package/src/__tests__/helpers/__tests__/component-test-utils.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-providers.test.tsx +2 -2
- package/src/__tests__/helpers/__tests__/test-utils.test.tsx +10 -10
- package/src/__tests__/integration/UserProfile.test.tsx +14 -14
- package/src/__tests__/rbac/PagePermissionGuard.test.tsx +6 -6
- package/src/__tests__/templates/accessibility.test.template.tsx +9 -9
- package/src/__tests__/templates/component.test.template.tsx +18 -15
- package/src/components/Calendar/Calendar.tsx +201 -47
- package/src/components/ContextSelector/ContextSelector.tsx +137 -153
- package/src/components/DataTable/AUDIT_REPORT.md +293 -0
- package/src/components/DataTable/__tests__/DataTableCore.test.tsx +10 -2
- package/src/components/DataTable/__tests__/a11y.basic.test.tsx +10 -4
- package/src/components/DataTable/__tests__/test-utils/sharedTestUtils.tsx +9 -9
- package/src/components/DataTable/components/ColumnFilter.tsx +63 -74
- package/src/components/DataTable/components/ColumnVisibilityDropdown.tsx +43 -41
- package/src/components/DataTable/components/DataTableErrorBoundary.tsx +9 -11
- package/src/components/DataTable/components/DataTableLayout.tsx +5 -16
- package/src/components/DataTable/components/EditableRow.tsx +5 -7
- package/src/components/DataTable/components/EmptyState.tsx +10 -9
- package/src/components/DataTable/components/FilterRow.tsx +2 -4
- package/src/components/DataTable/components/ImportModal.tsx +124 -126
- package/src/components/DataTable/components/LoadingState.tsx +5 -6
- package/src/components/DataTable/components/SortIndicator.tsx +50 -0
- package/src/components/DataTable/components/__tests__/COVERAGE_NOTE.md +4 -4
- package/src/components/DataTable/components/__tests__/ColumnFilter.test.tsx +23 -82
- package/src/components/DataTable/components/__tests__/DataTableErrorBoundary.test.tsx +37 -9
- package/src/components/DataTable/components/__tests__/EmptyState.test.tsx +7 -4
- package/src/components/DataTable/components/__tests__/FilterRow.test.tsx +12 -4
- package/src/components/DataTable/components/__tests__/LoadingState.test.tsx +41 -27
- package/src/components/DataTable/components/index.ts +2 -1
- package/src/components/DataTable/types.ts +0 -18
- package/src/components/DataTable/utils/a11yUtils.ts +17 -0
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.test.tsx +2 -1
- package/src/components/DatePickerWithTimezone/DatePickerWithTimezone.tsx +11 -15
- package/src/components/DateTimeField/DateTimeField.tsx +7 -8
- package/src/components/Dialog/Dialog.test.tsx +1 -0
- package/src/components/Dialog/Dialog.tsx +25 -8
- package/src/components/ErrorBoundary/ErrorBoundary.tsx +77 -79
- package/src/components/FileUpload/FileUpload.test.tsx +52 -14
- package/src/components/FileUpload/FileUpload.tsx +112 -130
- package/src/components/Progress/Progress.tsx +2 -4
- package/src/components/ProtectedRoute/ProtectedRoute.tsx +8 -8
- package/src/components/Select/Select.tsx +86 -77
- package/src/components/Select/types.ts +3 -0
- package/src/hooks/__tests__/ServiceHooks.test.tsx +16 -16
- package/src/hooks/__tests__/hooks.integration.test.tsx +49 -49
- package/src/hooks/__tests__/useFocusTrap.unit.test.tsx +97 -97
- package/src/hooks/public/usePublicEvent.ts +5 -5
- package/src/hooks/public/usePublicEventLogo.ts +5 -5
- package/src/hooks/public/usePublicFileDisplay.ts +2 -2
- package/src/hooks/public/usePublicRouteParams.ts +5 -5
- package/src/hooks/useAppConfig.ts +2 -2
- package/src/hooks/useEventTheme.test.ts +7 -7
- package/src/hooks/useEventTheme.ts +1 -4
- package/src/hooks/useFileDisplay.ts +2 -2
- package/src/providers/UnifiedAuthProvider.smoke.test.tsx +21 -21
- package/src/providers/__tests__/AuthProvider.test.tsx +21 -21
- package/src/providers/__tests__/EventProvider.test.tsx +61 -61
- package/src/providers/__tests__/InactivityProvider.test.tsx +56 -56
- package/src/providers/__tests__/OrganisationProvider.test.tsx +75 -75
- package/src/providers/__tests__/ProviderLifecycle.test.tsx +37 -37
- package/src/providers/__tests__/UnifiedAuthProvider.test.tsx +103 -103
- package/src/providers/services/__tests__/AuthServiceProvider.integration.test.tsx +7 -7
- package/src/providers/services/__tests__/UnifiedAuthProvider.integration.test.tsx +10 -10
- package/src/styles/core.css +7 -0
- package/src/theming/__tests__/parseEventColours.test.ts +9 -3
- package/src/theming/parseEventColours.ts +22 -10
- package/src/utils/__tests__/lazyLoad.unit.test.tsx +42 -39
- package/src/utils/storage/README.md +1 -1
- package/cursor-rules/01-standards-compliance.mdc +0 -285
- package/cursor-rules/04-testing-standards.mdc +0 -270
- package/cursor-rules/05-bug-reports-and-features.mdc +0 -248
- package/cursor-rules/06-code-quality.mdc +0 -311
- package/cursor-rules/07-tech-stack-compliance.mdc +0 -216
- package/cursor-rules/10-error-handling-patterns.mdc +0 -179
- package/cursor-rules/11-performance-optimization.mdc +0 -169
- package/cursor-rules/12-ci-cd-integration.mdc +0 -150
- package/dist/DataTable-LRJL4IRV.js +0 -15
- package/dist/eslint-rules/rules/compliance.cjs +0 -348
- package/dist/eslint-rules/rules/components.cjs +0 -113
- package/dist/eslint-rules/rules/imports.cjs +0 -102
- package/docs/best-practices/README.md +0 -472
- package/docs/best-practices/accessibility.md +0 -604
- package/docs/best-practices/common-patterns.md +0 -516
- package/docs/best-practices/deployment.md +0 -1103
- package/docs/best-practices/performance.md +0 -1328
- package/docs/best-practices/security.md +0 -940
- package/docs/best-practices/testing.md +0 -1034
- package/docs/rbac/compliance/compliance-guide.md +0 -544
- package/docs/standards/01-standards-compliance.md +0 -188
- package/docs/standards/03-solid-principles.md +0 -39
- package/docs/standards/04-testing-standards.md +0 -36
- package/docs/standards/05-bug-reports-and-features.md +0 -27
- package/docs/standards/06-code-quality.md +0 -34
- package/docs/standards/07-tech-stack-compliance.md +0 -30
- package/docs/standards/10-error-handling-patterns.md +0 -401
- package/docs/standards/11-performance-optimization.md +0 -348
- package/docs/standards/12-ci-cd-integration.md +0 -370
- package/docs/standards/ALIGNMENT_REVIEW_SUMMARY.md +0 -192
- package/scripts/audit/audit-compliance.cjs +0 -1295
- package/scripts/audit/audit-components.cjs +0 -260
- package/scripts/audit/audit-rbac.cjs +0 -954
- package/scripts/audit/audit-standards.cjs +0 -1268
- package/scripts/audit/index.cjs +0 -1927
- package/src/components/DataTable/components/DataTableBody.tsx +0 -478
- package/src/components/DataTable/components/DraggableColumnHeader.tsx +0 -156
- package/src/components/DataTable/components/ExpandButton.tsx +0 -113
- package/src/components/DataTable/components/GroupHeader.tsx +0 -54
- package/src/components/DataTable/components/ViewRowModal.tsx +0 -68
- package/src/components/DataTable/components/VirtualizedDataTable.tsx +0 -525
- package/src/components/DataTable/components/__tests__/ExpandButton.test.tsx +0 -462
- package/src/components/DataTable/components/__tests__/GroupHeader.test.tsx +0 -393
- package/src/components/DataTable/components/__tests__/ViewRowModal.test.tsx +0 -476
- package/src/components/DataTable/components/__tests__/VirtualizedDataTable.test.tsx +0 -128
- package/src/components/DataTable/core/DataTableContext.tsx +0 -216
- package/src/components/DataTable/core/__tests__/DataTableContext.test.tsx +0 -136
- package/src/components/DataTable/hooks/__tests__/useColumnReordering.test.ts +0 -570
- package/src/components/DataTable/hooks/useColumnReordering.ts +0 -123
- package/src/components/DataTable/utils/debugTools.ts +0 -514
- package/src/eslint-rules/index.cjs +0 -22
- package/src/eslint-rules/rules/components.cjs +0 -113
- package/src/eslint-rules/rules/imports.cjs +0 -102
- package/src/eslint-rules/rules/rbac.cjs +0 -790
- package/src/eslint-rules/utils/helpers.cjs +0 -42
- package/src/eslint-rules/utils/manifest-loader.cjs +0 -75
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# Styling
|
|
1
|
+
# Styling Standards
|
|
2
2
|
|
|
3
|
-
**🤖 Cursor Rule**: See [
|
|
3
|
+
**🤖 Cursor Rule**: See [05-styling.mdc](../../cursor-rules/05-styling.mdc) for AI-optimized directives that automatically enforce markup quality (this rule is ALWAYS APPLIED).
|
|
4
4
|
|
|
5
5
|
## Purpose
|
|
6
6
|
|
|
@@ -11,7 +11,8 @@ This standard defines the **REQUIRED** configuration for consuming apps to prope
|
|
|
11
11
|
- ✅ Tailwind v4 content scanning works properly
|
|
12
12
|
- ✅ Consistent styling across all PACE suite applications
|
|
13
13
|
|
|
14
|
-
## Component & Markup Guidance
|
|
14
|
+
## Component & Markup Guidance
|
|
15
|
+
|
|
15
16
|
- Components should be stateless when possible, fully typed, and accessibility-first.
|
|
16
17
|
- Prefer semantic HTML elements; use `<div>` only when no semantic element fits or when required by a library.
|
|
17
18
|
- Use React Fragments for grouping instead of wrapper nodes; keep markup minimal and avoid wrappers solely for styling.
|
|
@@ -20,12 +21,14 @@ This standard defines the **REQUIRED** configuration for consuming apps to prope
|
|
|
20
21
|
- Apply layout utilities to existing semantic parents or pace-core layout components.
|
|
21
22
|
|
|
22
23
|
### Component Principles
|
|
24
|
+
|
|
23
25
|
- Stateless when possible; keep surface area small and composable.
|
|
24
26
|
- Accessible by default with correct roles, keyboard support, and visible focus.
|
|
25
27
|
- UI primitives only; never add domain logic or data fetching inside components.
|
|
26
28
|
- Support controlled + uncontrolled usage where applicable.
|
|
27
29
|
|
|
28
30
|
### Testing Expectations
|
|
31
|
+
|
|
29
32
|
- Use React Testing Library + userEvent.
|
|
30
33
|
- Test key interactions; snapshots only for simple components.
|
|
31
34
|
- Keep components small—move non-UI logic to hooks/services.
|
|
@@ -185,7 +188,7 @@ import '@jmruthers/pace-core/styles/core.css'; /* ❌ WRONG */
|
|
|
185
188
|
|
|
186
189
|
**All shades (50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 950) plus `-raw` are REQUIRED.**
|
|
187
190
|
|
|
188
|
-
## Required Import in Entry Point
|
|
191
|
+
## Required Import in Entry Point
|
|
189
192
|
|
|
190
193
|
**MUST** import `app.css` in your entry point (e.g., `src/main.tsx`):
|
|
191
194
|
|
|
@@ -209,7 +212,7 @@ When you have additional entry points (storybook, tests, preview servers):
|
|
|
209
212
|
- If you need raw styles for non-React tooling, **import `@jmruthers/pace-core/styles/core.css` once** in that tool-specific stylesheet, never alongside `app.css`.
|
|
210
213
|
- If you are unsure, default to a single `app.css` import and remove any extra `core.css` imports.
|
|
211
214
|
|
|
212
|
-
## Styling & Markup Rules
|
|
215
|
+
## Styling & Markup Rules
|
|
213
216
|
|
|
214
217
|
- **No inline styles**: Do not use `style={{ ... }}` except when a third-party library strictly requires it. Prefer pace-core variants + Tailwind utilities.
|
|
215
218
|
- **Use theme tokens only**: Avoid arbitrary Tailwind colors (`text-gray-500`, `bg-red-500`) and bracket syntax (`bg-[oklch(...)]`). Use `main-*`, `sec-*`, `acc-*`, or semantic tokens like `text-foreground`.
|
|
@@ -334,12 +337,12 @@ import './app.css';
|
|
|
334
337
|
|
|
335
338
|
## Related Documentation
|
|
336
339
|
|
|
337
|
-
- [
|
|
338
|
-
- [Project Structure
|
|
339
|
-
- [
|
|
340
|
+
- [Standards Overview](./0-standards-overview.md) - Standards system overview
|
|
341
|
+
- [Project Structure](./2-project-structure-standards.md) - File organization standards
|
|
342
|
+
- [Architecture](./3-architecture-standards.md) - Component development standards
|
|
340
343
|
|
|
341
344
|
---
|
|
342
345
|
|
|
343
346
|
**Last Updated:** 2025-01-28
|
|
344
|
-
**Version:**
|
|
347
|
+
**Version:** 2.0.0
|
|
345
348
|
**Applies to:** All consuming apps using `@jmruthers/pace-core`
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
lastUpdated: 2025-01-28T00:00:00+11:00
|
|
3
|
-
version: 0.5.182
|
|
4
|
-
reviewedBy: rls-audit-and-fixes
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# RBAC and RLS Standard
|
|
1
|
+
# Security & RBAC Standards
|
|
8
2
|
|
|
9
|
-
**🤖 Cursor Rule**: See [
|
|
3
|
+
**🤖 Cursor Rule**: See [06-security-rbac.mdc](../../cursor-rules/06-security-rbac.mdc) for AI-optimized directives that automatically enforce RBAC contract compliance (ESLint-enforced).
|
|
10
4
|
|
|
11
5
|
## Purpose
|
|
12
6
|
|
|
13
7
|
Define standards for Row-Level Security (RLS) policies and Role-Based Access Control (RBAC) integration to ensure security, performance, and maintainability.
|
|
14
8
|
|
|
9
|
+
**Note:** General performance optimization patterns (React, caching, bundle size) are covered in [Operations Standards](./9-operations-standards.md). This document focuses on RLS-specific performance requirements.
|
|
10
|
+
|
|
15
11
|
## Principles
|
|
16
12
|
|
|
17
13
|
- **Performance First**: All RLS policies must use optimized helper functions
|
|
@@ -426,6 +422,52 @@ USING (
|
|
|
426
422
|
|
|
427
423
|
**Example:** `file_references`, `pace_address` (can be either organisation or user-scoped)
|
|
428
424
|
|
|
425
|
+
**Real-World Example: File References Table**
|
|
426
|
+
|
|
427
|
+
```sql
|
|
428
|
+
-- Real-world example: file_references table supports both organisation and user-scoped files
|
|
429
|
+
CREATE POLICY "rbac_select_file_references" ON file_references
|
|
430
|
+
FOR SELECT
|
|
431
|
+
USING (
|
|
432
|
+
-- Service role can access all files (for system operations)
|
|
433
|
+
is_service_role()
|
|
434
|
+
OR
|
|
435
|
+
-- Organisation-scoped files (shared within organisation)
|
|
436
|
+
(
|
|
437
|
+
organisation_id IS NOT NULL
|
|
438
|
+
AND is_authenticated_user()
|
|
439
|
+
AND (
|
|
440
|
+
is_super_admin(safe_get_user_id_for_rls())
|
|
441
|
+
OR check_user_organisation_access(organisation_id)
|
|
442
|
+
)
|
|
443
|
+
)
|
|
444
|
+
OR
|
|
445
|
+
-- User-scoped files (personal files)
|
|
446
|
+
(
|
|
447
|
+
organisation_id IS NULL
|
|
448
|
+
AND is_authenticated_user()
|
|
449
|
+
AND get_effective_user_id() = user_id
|
|
450
|
+
)
|
|
451
|
+
);
|
|
452
|
+
|
|
453
|
+
-- INSERT policy: Users can upload files to their organisation or personal storage
|
|
454
|
+
CREATE POLICY "rbac_insert_file_references" ON file_references
|
|
455
|
+
FOR INSERT TO authenticated
|
|
456
|
+
WITH CHECK (
|
|
457
|
+
-- Organisation-scoped: Must have organisation access
|
|
458
|
+
(
|
|
459
|
+
organisation_id IS NOT NULL
|
|
460
|
+
AND check_user_organisation_access(organisation_id)
|
|
461
|
+
)
|
|
462
|
+
OR
|
|
463
|
+
-- User-scoped: Must be own user_id
|
|
464
|
+
(
|
|
465
|
+
organisation_id IS NULL
|
|
466
|
+
AND get_effective_user_id() = user_id
|
|
467
|
+
)
|
|
468
|
+
);
|
|
469
|
+
```
|
|
470
|
+
|
|
429
471
|
### Service Role Policy
|
|
430
472
|
|
|
431
473
|
**Use Case:** Allow service_role to bypass RLS for system operations.
|
|
@@ -476,6 +518,66 @@ USING (
|
|
|
476
518
|
|
|
477
519
|
**Example:** `event` (public events), `forms` (published forms)
|
|
478
520
|
|
|
521
|
+
**Real-World Example: Public Event Registration**
|
|
522
|
+
|
|
523
|
+
```sql
|
|
524
|
+
-- Real-world example: Events table with public registration
|
|
525
|
+
-- Public users can view and register for public events
|
|
526
|
+
-- Authenticated users can view all events in their organisation
|
|
527
|
+
|
|
528
|
+
-- Public access: Anonymous users can view public events
|
|
529
|
+
CREATE POLICY "public_select_events" ON events
|
|
530
|
+
FOR SELECT TO anon
|
|
531
|
+
USING (
|
|
532
|
+
is_public = true
|
|
533
|
+
AND organisation_id IS NOT NULL
|
|
534
|
+
AND status = 'published'
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
-- Authenticated access: Users can view events in their organisation
|
|
538
|
+
CREATE POLICY "rbac_select_events" ON events
|
|
539
|
+
FOR SELECT TO authenticated
|
|
540
|
+
USING (
|
|
541
|
+
-- Public events (anyone can see)
|
|
542
|
+
(is_public = true AND organisation_id IS NOT NULL)
|
|
543
|
+
OR
|
|
544
|
+
-- Organisation events (members can see)
|
|
545
|
+
(
|
|
546
|
+
organisation_id IS NOT NULL
|
|
547
|
+
AND (
|
|
548
|
+
is_super_admin(safe_get_user_id_for_rls())
|
|
549
|
+
OR check_user_organisation_access(organisation_id)
|
|
550
|
+
)
|
|
551
|
+
)
|
|
552
|
+
);
|
|
553
|
+
|
|
554
|
+
-- Public registration: Anonymous users can create registrations for public events
|
|
555
|
+
CREATE POLICY "public_insert_event_registrations" ON event_registrations
|
|
556
|
+
FOR INSERT TO anon
|
|
557
|
+
WITH CHECK (
|
|
558
|
+
-- Only for public events
|
|
559
|
+
event_id IN (
|
|
560
|
+
SELECT id FROM events
|
|
561
|
+
WHERE is_public = true AND status = 'published'
|
|
562
|
+
)
|
|
563
|
+
);
|
|
564
|
+
|
|
565
|
+
-- Authenticated registration: Users can register for events in their organisation
|
|
566
|
+
CREATE POLICY "rbac_insert_event_registrations" ON event_registrations
|
|
567
|
+
FOR INSERT TO authenticated
|
|
568
|
+
WITH CHECK (
|
|
569
|
+
-- Must have access to the event's organisation
|
|
570
|
+
event_id IN (
|
|
571
|
+
SELECT id FROM events
|
|
572
|
+
WHERE organisation_id IS NOT NULL
|
|
573
|
+
AND (
|
|
574
|
+
is_super_admin(safe_get_user_id_for_rls())
|
|
575
|
+
OR check_user_organisation_access(organisation_id)
|
|
576
|
+
)
|
|
577
|
+
)
|
|
578
|
+
);
|
|
579
|
+
```
|
|
580
|
+
|
|
479
581
|
**Combined Public + Authenticated Pattern:**
|
|
480
582
|
```sql
|
|
481
583
|
-- Public access
|
|
@@ -494,7 +596,7 @@ USING (
|
|
|
494
596
|
OR (
|
|
495
597
|
organisation_id IS NOT NULL
|
|
496
598
|
AND (
|
|
497
|
-
is_super_admin()
|
|
599
|
+
is_super_admin(safe_get_user_id_for_rls())
|
|
498
600
|
OR check_user_organisation_access(organisation_id)
|
|
499
601
|
)
|
|
500
602
|
)
|
|
@@ -519,7 +621,7 @@ USING (
|
|
|
519
621
|
is_authenticated_user()
|
|
520
622
|
AND organisation_id IS NOT NULL
|
|
521
623
|
AND (
|
|
522
|
-
is_super_admin()
|
|
624
|
+
is_super_admin(safe_get_user_id_for_rls())
|
|
523
625
|
OR check_user_organisation_access(organisation_id)
|
|
524
626
|
)
|
|
525
627
|
)
|
|
@@ -710,7 +812,8 @@ export async function checkPermission(userId: string, permission: string) {
|
|
|
710
812
|
5. **MUST NOT** create custom RBAC helper functions
|
|
711
813
|
6. **MUST NOT** call `rbac_check_permission_simplified` RPC directly
|
|
712
814
|
|
|
713
|
-
## Security Baseline
|
|
815
|
+
## Security Baseline
|
|
816
|
+
|
|
714
817
|
- Never bypass RLS; validate all inputs and sanitize logs (no tokens/PII).
|
|
715
818
|
- Use safe, user-friendly error messaging.
|
|
716
819
|
- Prefer pace-core security helpers and secure clients (`useSecureSupabase`, RBAC helpers) over custom implementations.
|
|
@@ -779,17 +882,17 @@ Tables are assigned to specific apps for RBAC permission checking:
|
|
|
779
882
|
supabase advisors security
|
|
780
883
|
```
|
|
781
884
|
|
|
782
|
-
|
|
885
|
+
2. **Run Database Tests**:
|
|
783
886
|
```bash
|
|
784
887
|
timeout 120 npm run test:db
|
|
785
888
|
```
|
|
786
889
|
|
|
787
|
-
|
|
890
|
+
3. **Run Application Tests**:
|
|
788
891
|
```bash
|
|
789
892
|
timeout 60 npm run test
|
|
790
893
|
```
|
|
791
894
|
|
|
792
|
-
|
|
895
|
+
4. **Verify Performance**:
|
|
793
896
|
- Use EXPLAIN ANALYZE to verify no InitPlan nodes
|
|
794
897
|
- Verify queries complete in < 1 second
|
|
795
898
|
- Check Supabase Advisors show zero `auth_rls_initplan` warnings
|
|
@@ -868,7 +971,12 @@ date +"%Y%m%d%H%M%S"
|
|
|
868
971
|
|
|
869
972
|
## Related Documentation
|
|
870
973
|
|
|
871
|
-
-
|
|
872
|
-
- [
|
|
873
|
-
- [
|
|
874
|
-
|
|
974
|
+
- [Standards Overview](./0-standards-overview.md) - Standards system overview
|
|
975
|
+
- [pace-core Compliance](./1-pace-core-compliance-standards.md) - Secure Supabase client usage
|
|
976
|
+
- [Operations](./9-operations-standards.md) - General performance patterns (React, caching, etc.)
|
|
977
|
+
|
|
978
|
+
---
|
|
979
|
+
|
|
980
|
+
**Last Updated:** 2025-01-28
|
|
981
|
+
**Version:** 2.0.0
|
|
982
|
+
**Applies to:** All pace-core and consuming apps
|