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.
Files changed (242) hide show
  1. package/docker-template/.dockerignore +23 -23
  2. package/docker-template/.env.docker.example +69 -69
  3. package/docker-template/docker/db/init/99-jwt.sql +6 -6
  4. package/docker-template/docker/db/init/99-roles.sql +25 -25
  5. package/docker-template/docker/kong/kong.yml +112 -112
  6. package/docker-template/scripts/docker-setup.mjs +310 -310
  7. package/libs/db/tsconfig.lib.json +3 -3
  8. package/libs/editor/tsconfig.lib.json +3 -3
  9. package/libs/ui/tsconfig.lib.json +3 -3
  10. package/libs/utils/tsconfig.json +3 -3
  11. package/package.json +1 -1
  12. package/project.json +19 -19
  13. package/templates/nextblock-template/.browserslistrc +11 -11
  14. package/templates/nextblock-template/.dockerignore +23 -23
  15. package/templates/nextblock-template/README.md +34 -34
  16. package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
  17. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
  18. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  19. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  20. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  21. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  22. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  23. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  24. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  25. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  26. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  27. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  28. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  29. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  30. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  31. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  32. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5749
  33. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  34. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  35. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  36. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  37. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  38. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  39. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  40. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  41. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  42. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  43. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  44. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  45. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  46. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
  47. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  48. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  49. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  50. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  51. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  52. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  53. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  54. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  55. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  56. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  57. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  58. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  59. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  60. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  61. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  62. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  63. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  64. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  65. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  66. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  67. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  68. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  69. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  70. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  71. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  72. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  73. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  74. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  75. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  76. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  77. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  78. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  79. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  80. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  81. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  82. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  83. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  84. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  85. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
  86. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  87. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  88. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  89. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  90. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  91. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  92. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  93. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  94. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  95. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +23 -21
  96. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  97. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  98. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  99. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  100. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  101. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  102. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
  103. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  104. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  105. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  106. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  107. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  108. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  109. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  110. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  111. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  112. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  113. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  114. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  115. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  116. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  117. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  118. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  119. package/templates/nextblock-template/app/sitemap.ts +130 -130
  120. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  121. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  122. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  123. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  124. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  125. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  126. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  127. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  128. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  129. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  130. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  131. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  132. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  133. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  134. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  135. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  136. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  137. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  138. package/templates/nextblock-template/components/form-message.tsx +32 -32
  139. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
  140. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
  141. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  142. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  143. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  144. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  145. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
  146. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  147. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  148. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  149. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  150. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  151. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  152. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  153. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  154. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  155. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  156. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  157. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  158. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  159. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  160. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  161. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  162. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  163. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  164. package/templates/nextblock-template/docs/README.md +39 -39
  165. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  166. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  167. package/templates/nextblock-template/index.d.ts +7 -7
  168. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  169. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  170. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  171. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  172. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  173. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  174. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  175. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  176. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  177. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  178. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  179. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  180. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  181. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  182. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  183. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  184. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  185. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  186. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  187. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  188. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  189. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  190. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  191. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  192. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  193. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  194. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  195. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  196. package/templates/nextblock-template/lib/media/youtube.ts +99 -99
  197. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  198. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  199. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  200. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  201. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  202. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  203. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  204. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  205. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  206. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  207. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  208. package/templates/nextblock-template/lib/search/types.ts +27 -27
  209. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  210. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  211. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  212. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -87
  213. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  214. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  215. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  216. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  217. package/templates/nextblock-template/lib/site-url.ts +48 -48
  218. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  219. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  220. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  221. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  222. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  223. package/templates/nextblock-template/next-env.d.ts +1 -0
  224. package/templates/nextblock-template/package.json +6 -6
  225. package/templates/nextblock-template/postcss.config.js +6 -6
  226. package/templates/nextblock-template/scripts/backup.js +115 -115
  227. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  228. package/templates/nextblock-template/scripts/restore.js +385 -385
  229. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  230. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  231. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  232. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  233. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  234. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  235. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  236. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  237. package/templates/nextblock-template/tailwind.config.js +25 -25
  238. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  239. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  240. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  241. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  242. 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.