create-nextblock 0.14.0 → 0.14.2
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/docker-template/.dockerignore +23 -23
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/libs/db/tsconfig.lib.json +3 -3
- package/libs/editor/tsconfig.lib.json +3 -3
- package/libs/ui/tsconfig.lib.json +3 -3
- package/libs/utils/tsconfig.json +3 -3
- package/package.json +1 -1
- package/project.json +19 -19
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.dockerignore +23 -23
- package/templates/nextblock-template/README.md +34 -34
- package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/postActions.ts +146 -146
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5749
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/layout.tsx +73 -73
- package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
- package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
- package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +23 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/sitemap.ts +130 -130
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
- package/templates/nextblock-template/components/blocks/types.ts +7 -7
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -32
- package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
- package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
- package/templates/nextblock-template/docs/README.md +39 -39
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
- package/templates/nextblock-template/index.d.ts +7 -7
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
- package/templates/nextblock-template/lib/media/youtube.ts +99 -99
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/search/types.ts +27 -27
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -87
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/site-url.ts +48 -48
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/next-env.d.ts +1 -0
- package/templates/nextblock-template/package.json +6 -6
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
|
@@ -1,246 +1,246 @@
|
|
|
1
|
-
# 04 Database and Auth
|
|
2
|
-
|
|
3
|
-
## Source of Truth
|
|
4
|
-
|
|
5
|
-
The database and auth implementation is spread across:
|
|
6
|
-
|
|
7
|
-
- `libs/db/src/lib/supabase/*`
|
|
8
|
-
- `libs/db/src/lib/package-validation.ts`
|
|
9
|
-
- `libs/db/src/supabase/config.toml`
|
|
10
|
-
- `libs/db/src/supabase/migrations/*`
|
|
11
|
-
- `apps/nextblock/app/auth/callback/route.ts`
|
|
12
|
-
- `apps/nextblock/app/cms/*`
|
|
13
|
-
|
|
14
|
-
When documentation and a migration disagree, the migration folder is the final
|
|
15
|
-
authority for schema, triggers, grants, and policies.
|
|
16
|
-
|
|
17
|
-
## Supabase Client Surfaces
|
|
18
|
-
|
|
19
|
-
`libs/db/src/server.ts` currently exports:
|
|
20
|
-
|
|
21
|
-
- `createClient()`: request-scoped server client using auth cookies
|
|
22
|
-
- `getProfileWithRoleServerSide()`
|
|
23
|
-
- `getActiveLanguagesServerSide()`
|
|
24
|
-
- `getServiceRoleSupabaseClient()`
|
|
25
|
-
- `getSsgSupabaseClient()`
|
|
26
|
-
- package activation helpers such as `verifyPackageOnline()`
|
|
27
|
-
|
|
28
|
-
Practical usage in the app is split by trust level:
|
|
29
|
-
|
|
30
|
-
- normal server routes and components use `createClient()`
|
|
31
|
-
- public static-ish reads often use `getSsgSupabaseClient()`
|
|
32
|
-
- admin or system workflows use `getServiceRoleSupabaseClient()`
|
|
33
|
-
|
|
34
|
-
## Auth Flow
|
|
35
|
-
|
|
36
|
-
### Session exchange
|
|
37
|
-
|
|
38
|
-
`app/auth/callback/route.ts` handles Supabase auth callback exchanges:
|
|
39
|
-
|
|
40
|
-
1. read the `code` query parameter
|
|
41
|
-
2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
|
|
42
|
-
3. load the user's profile and role
|
|
43
|
-
4. redirect through `resolvePostAuthRedirect()`
|
|
44
|
-
|
|
45
|
-
### Profile creation
|
|
46
|
-
|
|
47
|
-
The first-user and profile bootstrap logic lives in the database, not in React
|
|
48
|
-
code.
|
|
49
|
-
|
|
50
|
-
`00000000000005_setup_functions_and_triggers.sql` defines:
|
|
51
|
-
|
|
52
|
-
- `handle_new_user()`
|
|
53
|
-
- `on_auth_user_created` trigger on `auth.users`
|
|
54
|
-
|
|
55
|
-
That trigger:
|
|
56
|
-
|
|
57
|
-
- creates the first local admin automatically
|
|
58
|
-
- creates later users as `USER`
|
|
59
|
-
- inserts or updates `profiles`
|
|
60
|
-
- copies selected metadata such as `full_name`, avatar URL, and GitHub username
|
|
61
|
-
|
|
62
|
-
### CMS authorization
|
|
63
|
-
|
|
64
|
-
The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
|
|
65
|
-
|
|
66
|
-
- an authenticated user
|
|
67
|
-
- a resolved profile role of `ADMIN` or `WRITER`
|
|
68
|
-
|
|
69
|
-
Writers and admins can enter the CMS. Admin-only navigation is used for
|
|
70
|
-
settings such as payments, shipping, users, and some branding/config surfaces.
|
|
71
|
-
|
|
72
|
-
### No live app middleware file
|
|
73
|
-
|
|
74
|
-
There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
|
|
75
|
-
but there is no live `apps/nextblock/middleware.ts` file in the current app.
|
|
76
|
-
Document the callback, layout, and RLS model as the active auth path rather
|
|
77
|
-
than assuming middleware-based route protection is in use.
|
|
78
|
-
|
|
79
|
-
## Schema Overview
|
|
80
|
-
|
|
81
|
-
### Core platform tables
|
|
82
|
-
|
|
83
|
-
Defined primarily in `00000000000001_setup_cms_core.sql`:
|
|
84
|
-
|
|
85
|
-
- `site_settings`
|
|
86
|
-
- `profiles`
|
|
87
|
-
- `user_addresses`
|
|
88
|
-
- `languages`
|
|
89
|
-
- `media`
|
|
90
|
-
- `translations`
|
|
91
|
-
- `logos`
|
|
92
|
-
|
|
93
|
-
### Content tables
|
|
94
|
-
|
|
95
|
-
Defined primarily in `00000000000002_setup_content_tables.sql`:
|
|
96
|
-
|
|
97
|
-
- `posts`
|
|
98
|
-
- `pages`
|
|
99
|
-
- `blocks`
|
|
100
|
-
- `navigation_items`
|
|
101
|
-
- `page_revisions`
|
|
102
|
-
- `post_revisions`
|
|
103
|
-
|
|
104
|
-
### Commerce tables
|
|
105
|
-
|
|
106
|
-
Defined across `00000000000003` and `00000000000004`:
|
|
107
|
-
|
|
108
|
-
- `products`
|
|
109
|
-
- `product_media`
|
|
110
|
-
- `product_attributes`
|
|
111
|
-
- `product_attribute_terms`
|
|
112
|
-
- `product_variants`
|
|
113
|
-
- `inventory_items`
|
|
114
|
-
- `variant_attribute_mapping`
|
|
115
|
-
- `package_activations`
|
|
116
|
-
- `freemius_plans`
|
|
117
|
-
- `freemius_pricing`
|
|
118
|
-
- `orders`
|
|
119
|
-
- `order_items`
|
|
120
|
-
- `shipping_zones`
|
|
121
|
-
- `shipping_zone_locations`
|
|
122
|
-
- `shipping_zone_methods`
|
|
123
|
-
- `tax_rates`
|
|
124
|
-
- `currencies`
|
|
125
|
-
|
|
126
|
-
### Post-baseline tables
|
|
127
|
-
|
|
128
|
-
Added after the squashed baseline by later migrations:
|
|
129
|
-
|
|
130
|
-
- `categories` and `product_categories` — catalog organization
|
|
131
|
-
(migration `00000000000019`; translated via `00000000000020`)
|
|
132
|
-
- `custom_block_definitions` — data-driven custom block registry
|
|
133
|
-
(migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
|
|
134
|
-
- `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
|
|
135
|
-
- a `blocks` JSONB column plus `product_id` link for block-based product
|
|
136
|
-
descriptions (migration `00000000000017`)
|
|
137
|
-
|
|
138
|
-
## Row Level Security Patterns
|
|
139
|
-
|
|
140
|
-
`00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
|
|
141
|
-
|
|
142
|
-
The high-level access model is:
|
|
143
|
-
|
|
144
|
-
- public read access for languages, media, translations, published content, and
|
|
145
|
-
several storefront commerce tables
|
|
146
|
-
- authenticated self-service access for user addresses and customer-owned
|
|
147
|
-
orders
|
|
148
|
-
- `ADMIN` or `WRITER` write access for most CMS authoring tables
|
|
149
|
-
- `ADMIN`-only write access for higher-risk configuration surfaces
|
|
150
|
-
- `service_role` full access where background jobs or system syncs need it
|
|
151
|
-
|
|
152
|
-
Commerce-specific policy highlights include:
|
|
153
|
-
|
|
154
|
-
- public read access for products, product media, product attributes, variants,
|
|
155
|
-
shipping zones, shipping methods, tax rates, and active currencies
|
|
156
|
-
- customer-scoped read access for `orders` and `order_items`
|
|
157
|
-
- service-role management access for orders, order items, inventory, taxes, and
|
|
158
|
-
currencies
|
|
159
|
-
|
|
160
|
-
## Migration Structure
|
|
161
|
-
|
|
162
|
-
### Current reality
|
|
163
|
-
|
|
164
|
-
The folder was **re-baselined in 2026-07**: the previous 45 migrations
|
|
165
|
-
(`00000000000000`–`00000000000044`) were squashed into a four-file idempotent
|
|
166
|
-
baseline, generated from a fresh-apply `pg_dump` by
|
|
167
|
-
`tools/scripts/rebaseline-transform.mjs` and verified byte-identical to the old
|
|
168
|
-
tree. The current sequence is:
|
|
169
|
-
|
|
170
|
-
- `00000000000000_baseline_schema.sql` — enums, functions, tables, sequences
|
|
171
|
-
(all `IF NOT EXISTS` / `CREATE OR REPLACE`) plus the re-attached `auth.users`
|
|
172
|
-
→ `handle_new_user` trigger.
|
|
173
|
-
- `00000000000001_baseline_constraints_and_indexes.sql` — primary/unique/check
|
|
174
|
-
and foreign-key constraints (guarded) plus all indexes.
|
|
175
|
-
- `00000000000002_baseline_security_and_grants.sql` — RLS enablement, policies
|
|
176
|
-
(`DROP … IF EXISTS` first), triggers, and grants.
|
|
177
|
-
- `00000000000003_baseline_seed.sql` — canonical demo content, `ON CONFLICT DO
|
|
178
|
-
NOTHING` (no users, no secrets).
|
|
179
|
-
|
|
180
|
-
Every file is fully idempotent. Existing databases already have versions
|
|
181
|
-
`000`–`003` recorded, so both appliers skip the baseline — it only runs on a
|
|
182
|
-
fresh/empty database. **The next new migration is `00000000000004`**, appended
|
|
183
|
-
forward-only.
|
|
184
|
-
|
|
185
|
-
### Production migration policy
|
|
186
|
-
|
|
187
|
-
NextBlock has live Supabase data. Treat migrations as append-only for any
|
|
188
|
-
production or shared database change.
|
|
189
|
-
|
|
190
|
-
- Do not edit, recycle, squash, reorder, or delete migration files that may
|
|
191
|
-
already be recorded in a shared or production Supabase project.
|
|
192
|
-
- Add a new forward-only `.sql` file under
|
|
193
|
-
`libs/db/src/supabase/migrations` for each new schema/data change.
|
|
194
|
-
- Keep migrations non-destructive by default. Avoid dropping or rewriting data
|
|
195
|
-
that may include orders, users, payments, or customer records.
|
|
196
|
-
- Run `npm run db:migrate:check` before `npm run db:migrate`.
|
|
197
|
-
- If an existing database lists old baseline files such as
|
|
198
|
-
`00000000000000_baseline_schema.sql` as pending, do not replay them. Use
|
|
199
|
-
`npm run db:migrate:repair-history:check`, then
|
|
200
|
-
`npm run db:migrate:repair-history --through=00000000000003` (the baseline's
|
|
201
|
-
top file creates no tables, so auto-detection otherwise stops at `000`), then
|
|
202
|
-
rerun `npm run db:migrate:check`.
|
|
203
|
-
- Use `npm run db:migrate:fresh` only for a brand-new empty database.
|
|
204
|
-
|
|
205
|
-
### Category map
|
|
206
|
-
|
|
207
|
-
| Migration file | Domain | What it covers |
|
|
208
|
-
| :-- | :-- | :-- |
|
|
209
|
-
| `00000000000000_baseline_schema.sql` | Core, CMS, Commerce | all enums, 40 functions, 49 tables + sequences (idempotent), and the `auth.users` → `handle_new_user` bootstrap trigger |
|
|
210
|
-
| `00000000000001_baseline_constraints_and_indexes.sql` | Core, CMS, Commerce | all primary/unique/check + foreign-key constraints (guarded) and every index |
|
|
211
|
-
| `00000000000002_baseline_security_and_grants.sql` | Security | RLS enablement on every table, all policies, timestamp/business triggers, grants |
|
|
212
|
-
| `00000000000003_baseline_seed.sql` | Seeds | canonical demo content — languages, currencies, site settings, translations, media, pages/posts/blocks, navigation, shipping defaults — all `ON CONFLICT DO NOTHING` |
|
|
213
|
-
|
|
214
|
-
The pre-2026-07 history (foundation/enums, cms_core, content_tables, catalog,
|
|
215
|
-
fulfillment, functions_and_triggers, rls_and_grants, indexes, the seed files, and
|
|
216
|
-
later additions like custom block definitions, product blocks, categories, cart
|
|
217
|
-
sessions, drafts, privacy/MFA, system alerts, interactions) is all folded into the
|
|
218
|
-
four files above; the earlier per-file boundaries survive only as comment headers
|
|
219
|
-
inside the generated SQL.
|
|
220
|
-
|
|
221
|
-
### How to read the folder
|
|
222
|
-
|
|
223
|
-
Read the migrations in lexical order from `00000000000000` upward.
|
|
224
|
-
|
|
225
|
-
That sequence is the cleanest under-the-hood blueprint for:
|
|
226
|
-
|
|
227
|
-
- which tables exist
|
|
228
|
-
- what triggers and functions are available
|
|
229
|
-
- what security rules are enforced
|
|
230
|
-
- what default content and configuration are seeded
|
|
231
|
-
|
|
232
|
-
If you need to understand whether the platform really supports something, check
|
|
233
|
-
the migration file first, then trace the corresponding route or library code.
|
|
234
|
-
|
|
235
|
-
## Important Site Settings in Active Use
|
|
236
|
-
|
|
237
|
-
These keys are actively referenced by the current codebase:
|
|
238
|
-
|
|
239
|
-
- `enabled_payment_providers`
|
|
240
|
-
- `ecommerce_inventory_settings`
|
|
241
|
-
- `invoice_settings`
|
|
242
|
-
- `footer_copyright`
|
|
243
|
-
- `is_admin_created`
|
|
244
|
-
|
|
245
|
-
There are many more seeded settings, but these are the most important ones for
|
|
246
|
-
understanding current runtime behavior.
|
|
1
|
+
# 04 Database and Auth
|
|
2
|
+
|
|
3
|
+
## Source of Truth
|
|
4
|
+
|
|
5
|
+
The database and auth implementation is spread across:
|
|
6
|
+
|
|
7
|
+
- `libs/db/src/lib/supabase/*`
|
|
8
|
+
- `libs/db/src/lib/package-validation.ts`
|
|
9
|
+
- `libs/db/src/supabase/config.toml`
|
|
10
|
+
- `libs/db/src/supabase/migrations/*`
|
|
11
|
+
- `apps/nextblock/app/auth/callback/route.ts`
|
|
12
|
+
- `apps/nextblock/app/cms/*`
|
|
13
|
+
|
|
14
|
+
When documentation and a migration disagree, the migration folder is the final
|
|
15
|
+
authority for schema, triggers, grants, and policies.
|
|
16
|
+
|
|
17
|
+
## Supabase Client Surfaces
|
|
18
|
+
|
|
19
|
+
`libs/db/src/server.ts` currently exports:
|
|
20
|
+
|
|
21
|
+
- `createClient()`: request-scoped server client using auth cookies
|
|
22
|
+
- `getProfileWithRoleServerSide()`
|
|
23
|
+
- `getActiveLanguagesServerSide()`
|
|
24
|
+
- `getServiceRoleSupabaseClient()`
|
|
25
|
+
- `getSsgSupabaseClient()`
|
|
26
|
+
- package activation helpers such as `verifyPackageOnline()`
|
|
27
|
+
|
|
28
|
+
Practical usage in the app is split by trust level:
|
|
29
|
+
|
|
30
|
+
- normal server routes and components use `createClient()`
|
|
31
|
+
- public static-ish reads often use `getSsgSupabaseClient()`
|
|
32
|
+
- admin or system workflows use `getServiceRoleSupabaseClient()`
|
|
33
|
+
|
|
34
|
+
## Auth Flow
|
|
35
|
+
|
|
36
|
+
### Session exchange
|
|
37
|
+
|
|
38
|
+
`app/auth/callback/route.ts` handles Supabase auth callback exchanges:
|
|
39
|
+
|
|
40
|
+
1. read the `code` query parameter
|
|
41
|
+
2. exchange it for a session with `supabase.auth.exchangeCodeForSession()`
|
|
42
|
+
3. load the user's profile and role
|
|
43
|
+
4. redirect through `resolvePostAuthRedirect()`
|
|
44
|
+
|
|
45
|
+
### Profile creation
|
|
46
|
+
|
|
47
|
+
The first-user and profile bootstrap logic lives in the database, not in React
|
|
48
|
+
code.
|
|
49
|
+
|
|
50
|
+
`00000000000005_setup_functions_and_triggers.sql` defines:
|
|
51
|
+
|
|
52
|
+
- `handle_new_user()`
|
|
53
|
+
- `on_auth_user_created` trigger on `auth.users`
|
|
54
|
+
|
|
55
|
+
That trigger:
|
|
56
|
+
|
|
57
|
+
- creates the first local admin automatically
|
|
58
|
+
- creates later users as `USER`
|
|
59
|
+
- inserts or updates `profiles`
|
|
60
|
+
- copies selected metadata such as `full_name`, avatar URL, and GitHub username
|
|
61
|
+
|
|
62
|
+
### CMS authorization
|
|
63
|
+
|
|
64
|
+
The CMS shell in `app/cms/CmsClientLayout.tsx` currently expects:
|
|
65
|
+
|
|
66
|
+
- an authenticated user
|
|
67
|
+
- a resolved profile role of `ADMIN` or `WRITER`
|
|
68
|
+
|
|
69
|
+
Writers and admins can enter the CMS. Admin-only navigation is used for
|
|
70
|
+
settings such as payments, shipping, users, and some branding/config surfaces.
|
|
71
|
+
|
|
72
|
+
### No live app middleware file
|
|
73
|
+
|
|
74
|
+
There is a generic Supabase middleware helper in `libs/db/src/lib/supabase`,
|
|
75
|
+
but there is no live `apps/nextblock/middleware.ts` file in the current app.
|
|
76
|
+
Document the callback, layout, and RLS model as the active auth path rather
|
|
77
|
+
than assuming middleware-based route protection is in use.
|
|
78
|
+
|
|
79
|
+
## Schema Overview
|
|
80
|
+
|
|
81
|
+
### Core platform tables
|
|
82
|
+
|
|
83
|
+
Defined primarily in `00000000000001_setup_cms_core.sql`:
|
|
84
|
+
|
|
85
|
+
- `site_settings`
|
|
86
|
+
- `profiles`
|
|
87
|
+
- `user_addresses`
|
|
88
|
+
- `languages`
|
|
89
|
+
- `media`
|
|
90
|
+
- `translations`
|
|
91
|
+
- `logos`
|
|
92
|
+
|
|
93
|
+
### Content tables
|
|
94
|
+
|
|
95
|
+
Defined primarily in `00000000000002_setup_content_tables.sql`:
|
|
96
|
+
|
|
97
|
+
- `posts`
|
|
98
|
+
- `pages`
|
|
99
|
+
- `blocks`
|
|
100
|
+
- `navigation_items`
|
|
101
|
+
- `page_revisions`
|
|
102
|
+
- `post_revisions`
|
|
103
|
+
|
|
104
|
+
### Commerce tables
|
|
105
|
+
|
|
106
|
+
Defined across `00000000000003` and `00000000000004`:
|
|
107
|
+
|
|
108
|
+
- `products`
|
|
109
|
+
- `product_media`
|
|
110
|
+
- `product_attributes`
|
|
111
|
+
- `product_attribute_terms`
|
|
112
|
+
- `product_variants`
|
|
113
|
+
- `inventory_items`
|
|
114
|
+
- `variant_attribute_mapping`
|
|
115
|
+
- `package_activations`
|
|
116
|
+
- `freemius_plans`
|
|
117
|
+
- `freemius_pricing`
|
|
118
|
+
- `orders`
|
|
119
|
+
- `order_items`
|
|
120
|
+
- `shipping_zones`
|
|
121
|
+
- `shipping_zone_locations`
|
|
122
|
+
- `shipping_zone_methods`
|
|
123
|
+
- `tax_rates`
|
|
124
|
+
- `currencies`
|
|
125
|
+
|
|
126
|
+
### Post-baseline tables
|
|
127
|
+
|
|
128
|
+
Added after the squashed baseline by later migrations:
|
|
129
|
+
|
|
130
|
+
- `categories` and `product_categories` — catalog organization
|
|
131
|
+
(migration `00000000000019`; translated via `00000000000020`)
|
|
132
|
+
- `custom_block_definitions` — data-driven custom block registry
|
|
133
|
+
(migration `00000000000023`; see [10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md))
|
|
134
|
+
- `ucp_cart_sessions` — persisted cart sessions (migration `00000000000024`)
|
|
135
|
+
- a `blocks` JSONB column plus `product_id` link for block-based product
|
|
136
|
+
descriptions (migration `00000000000017`)
|
|
137
|
+
|
|
138
|
+
## Row Level Security Patterns
|
|
139
|
+
|
|
140
|
+
`00000000000006_setup_rls_and_grants.sql` is the consolidated RLS file.
|
|
141
|
+
|
|
142
|
+
The high-level access model is:
|
|
143
|
+
|
|
144
|
+
- public read access for languages, media, translations, published content, and
|
|
145
|
+
several storefront commerce tables
|
|
146
|
+
- authenticated self-service access for user addresses and customer-owned
|
|
147
|
+
orders
|
|
148
|
+
- `ADMIN` or `WRITER` write access for most CMS authoring tables
|
|
149
|
+
- `ADMIN`-only write access for higher-risk configuration surfaces
|
|
150
|
+
- `service_role` full access where background jobs or system syncs need it
|
|
151
|
+
|
|
152
|
+
Commerce-specific policy highlights include:
|
|
153
|
+
|
|
154
|
+
- public read access for products, product media, product attributes, variants,
|
|
155
|
+
shipping zones, shipping methods, tax rates, and active currencies
|
|
156
|
+
- customer-scoped read access for `orders` and `order_items`
|
|
157
|
+
- service-role management access for orders, order items, inventory, taxes, and
|
|
158
|
+
currencies
|
|
159
|
+
|
|
160
|
+
## Migration Structure
|
|
161
|
+
|
|
162
|
+
### Current reality
|
|
163
|
+
|
|
164
|
+
The folder was **re-baselined in 2026-07**: the previous 45 migrations
|
|
165
|
+
(`00000000000000`–`00000000000044`) were squashed into a four-file idempotent
|
|
166
|
+
baseline, generated from a fresh-apply `pg_dump` by
|
|
167
|
+
`tools/scripts/rebaseline-transform.mjs` and verified byte-identical to the old
|
|
168
|
+
tree. The current sequence is:
|
|
169
|
+
|
|
170
|
+
- `00000000000000_baseline_schema.sql` — enums, functions, tables, sequences
|
|
171
|
+
(all `IF NOT EXISTS` / `CREATE OR REPLACE`) plus the re-attached `auth.users`
|
|
172
|
+
→ `handle_new_user` trigger.
|
|
173
|
+
- `00000000000001_baseline_constraints_and_indexes.sql` — primary/unique/check
|
|
174
|
+
and foreign-key constraints (guarded) plus all indexes.
|
|
175
|
+
- `00000000000002_baseline_security_and_grants.sql` — RLS enablement, policies
|
|
176
|
+
(`DROP … IF EXISTS` first), triggers, and grants.
|
|
177
|
+
- `00000000000003_baseline_seed.sql` — canonical demo content, `ON CONFLICT DO
|
|
178
|
+
NOTHING` (no users, no secrets).
|
|
179
|
+
|
|
180
|
+
Every file is fully idempotent. Existing databases already have versions
|
|
181
|
+
`000`–`003` recorded, so both appliers skip the baseline — it only runs on a
|
|
182
|
+
fresh/empty database. **The next new migration is `00000000000004`**, appended
|
|
183
|
+
forward-only.
|
|
184
|
+
|
|
185
|
+
### Production migration policy
|
|
186
|
+
|
|
187
|
+
NextBlock has live Supabase data. Treat migrations as append-only for any
|
|
188
|
+
production or shared database change.
|
|
189
|
+
|
|
190
|
+
- Do not edit, recycle, squash, reorder, or delete migration files that may
|
|
191
|
+
already be recorded in a shared or production Supabase project.
|
|
192
|
+
- Add a new forward-only `.sql` file under
|
|
193
|
+
`libs/db/src/supabase/migrations` for each new schema/data change.
|
|
194
|
+
- Keep migrations non-destructive by default. Avoid dropping or rewriting data
|
|
195
|
+
that may include orders, users, payments, or customer records.
|
|
196
|
+
- Run `npm run db:migrate:check` before `npm run db:migrate`.
|
|
197
|
+
- If an existing database lists old baseline files such as
|
|
198
|
+
`00000000000000_baseline_schema.sql` as pending, do not replay them. Use
|
|
199
|
+
`npm run db:migrate:repair-history:check`, then
|
|
200
|
+
`npm run db:migrate:repair-history --through=00000000000003` (the baseline's
|
|
201
|
+
top file creates no tables, so auto-detection otherwise stops at `000`), then
|
|
202
|
+
rerun `npm run db:migrate:check`.
|
|
203
|
+
- Use `npm run db:migrate:fresh` only for a brand-new empty database.
|
|
204
|
+
|
|
205
|
+
### Category map
|
|
206
|
+
|
|
207
|
+
| Migration file | Domain | What it covers |
|
|
208
|
+
| :-- | :-- | :-- |
|
|
209
|
+
| `00000000000000_baseline_schema.sql` | Core, CMS, Commerce | all enums, 40 functions, 49 tables + sequences (idempotent), and the `auth.users` → `handle_new_user` bootstrap trigger |
|
|
210
|
+
| `00000000000001_baseline_constraints_and_indexes.sql` | Core, CMS, Commerce | all primary/unique/check + foreign-key constraints (guarded) and every index |
|
|
211
|
+
| `00000000000002_baseline_security_and_grants.sql` | Security | RLS enablement on every table, all policies, timestamp/business triggers, grants |
|
|
212
|
+
| `00000000000003_baseline_seed.sql` | Seeds | canonical demo content — languages, currencies, site settings, translations, media, pages/posts/blocks, navigation, shipping defaults — all `ON CONFLICT DO NOTHING` |
|
|
213
|
+
|
|
214
|
+
The pre-2026-07 history (foundation/enums, cms_core, content_tables, catalog,
|
|
215
|
+
fulfillment, functions_and_triggers, rls_and_grants, indexes, the seed files, and
|
|
216
|
+
later additions like custom block definitions, product blocks, categories, cart
|
|
217
|
+
sessions, drafts, privacy/MFA, system alerts, interactions) is all folded into the
|
|
218
|
+
four files above; the earlier per-file boundaries survive only as comment headers
|
|
219
|
+
inside the generated SQL.
|
|
220
|
+
|
|
221
|
+
### How to read the folder
|
|
222
|
+
|
|
223
|
+
Read the migrations in lexical order from `00000000000000` upward.
|
|
224
|
+
|
|
225
|
+
That sequence is the cleanest under-the-hood blueprint for:
|
|
226
|
+
|
|
227
|
+
- which tables exist
|
|
228
|
+
- what triggers and functions are available
|
|
229
|
+
- what security rules are enforced
|
|
230
|
+
- what default content and configuration are seeded
|
|
231
|
+
|
|
232
|
+
If you need to understand whether the platform really supports something, check
|
|
233
|
+
the migration file first, then trace the corresponding route or library code.
|
|
234
|
+
|
|
235
|
+
## Important Site Settings in Active Use
|
|
236
|
+
|
|
237
|
+
These keys are actively referenced by the current codebase:
|
|
238
|
+
|
|
239
|
+
- `enabled_payment_providers`
|
|
240
|
+
- `ecommerce_inventory_settings`
|
|
241
|
+
- `invoice_settings`
|
|
242
|
+
- `footer_copyright`
|
|
243
|
+
- `is_admin_created`
|
|
244
|
+
|
|
245
|
+
There are many more seeded settings, but these are the most important ones for
|
|
246
|
+
understanding current runtime behavior.
|