nextly 0.0.1 → 0.0.2-alpha.0

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 (268) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +122 -0
  3. package/dist/_dts-chunks/collections-handler.d-DjgO74Wt.d.ts +20540 -0
  4. package/dist/_dts-chunks/config.d-DNwsDnjs.d.ts +2589 -0
  5. package/dist/_dts-chunks/define-component.d-BUgTHmt3.d.ts +1149 -0
  6. package/dist/_dts-chunks/image-processor.d-OO1PmMrv.d.ts +335 -0
  7. package/dist/_dts-chunks/index.d-axCAzZ7m.d.ts +17842 -0
  8. package/dist/_dts-chunks/media.d-DjDOZo4B.d.ts +117 -0
  9. package/dist/_dts-chunks/on-error.d-CHIKWNxd.d.ts +38 -0
  10. package/dist/_dts-chunks/storage.d-BUhQ2we_.d.ts +404 -0
  11. package/dist/actions/index.d.ts +239 -0
  12. package/dist/actions/index.mjs +281 -0
  13. package/dist/api/auth-state.d.ts +5 -0
  14. package/dist/api/auth-state.mjs +131 -0
  15. package/dist/api/collections-schema-detail.d.ts +56 -0
  16. package/dist/api/collections-schema-detail.mjs +244 -0
  17. package/dist/api/collections-schema-export.d.ts +56 -0
  18. package/dist/api/collections-schema-export.mjs +129 -0
  19. package/dist/api/collections-schema.d.ts +59 -0
  20. package/dist/api/collections-schema.mjs +207 -0
  21. package/dist/api/components-detail.d.ts +50 -0
  22. package/dist/api/components-detail.mjs +132 -0
  23. package/dist/api/components.d.ts +69 -0
  24. package/dist/api/components.mjs +144 -0
  25. package/dist/api/email-providers-default.d.ts +40 -0
  26. package/dist/api/email-providers-default.mjs +75 -0
  27. package/dist/api/email-providers-detail.d.ts +81 -0
  28. package/dist/api/email-providers-detail.mjs +109 -0
  29. package/dist/api/email-providers-test.d.ts +43 -0
  30. package/dist/api/email-providers-test.mjs +114 -0
  31. package/dist/api/email-providers.d.ts +69 -0
  32. package/dist/api/email-providers.mjs +110 -0
  33. package/dist/api/email-send-template.d.ts +41 -0
  34. package/dist/api/email-send-template.mjs +58 -0
  35. package/dist/api/email-send.d.ts +42 -0
  36. package/dist/api/email-send.mjs +58 -0
  37. package/dist/api/email-templates-detail.d.ts +74 -0
  38. package/dist/api/email-templates-detail.mjs +112 -0
  39. package/dist/api/email-templates-layout.d.ts +55 -0
  40. package/dist/api/email-templates-layout.mjs +92 -0
  41. package/dist/api/email-templates-preview.d.ts +48 -0
  42. package/dist/api/email-templates-preview.mjs +93 -0
  43. package/dist/api/email-templates.d.ts +61 -0
  44. package/dist/api/email-templates.mjs +118 -0
  45. package/dist/api/health.d.ts +68 -0
  46. package/dist/api/health.mjs +67 -0
  47. package/dist/api/index.d.ts +54 -0
  48. package/dist/api/index.mjs +16 -0
  49. package/dist/api/media-bulk.d.ts +74 -0
  50. package/dist/api/media-bulk.mjs +196 -0
  51. package/dist/api/media-folders.d.ts +112 -0
  52. package/dist/api/media-folders.mjs +187 -0
  53. package/dist/api/media-handlers.d.ts +102 -0
  54. package/dist/api/media-handlers.mjs +437 -0
  55. package/dist/api/media.d.ts +117 -0
  56. package/dist/api/media.mjs +242 -0
  57. package/dist/api/singles-detail.d.ts +87 -0
  58. package/dist/api/singles-detail.mjs +170 -0
  59. package/dist/api/singles-schema-detail.d.ts +54 -0
  60. package/dist/api/singles-schema-detail.mjs +182 -0
  61. package/dist/api/singles.d.ts +34 -0
  62. package/dist/api/singles.mjs +94 -0
  63. package/dist/api/storage-upload-url.d.ts +48 -0
  64. package/dist/api/storage-upload-url.mjs +202 -0
  65. package/dist/api/uploads.d.ts +109 -0
  66. package/dist/api/uploads.mjs +359 -0
  67. package/dist/auth/index.d.ts +425 -0
  68. package/dist/auth/index.mjs +199 -0
  69. package/dist/boot-apply-PQSYLDIN.mjs +7 -0
  70. package/dist/chunk-2OALJTK6.mjs +489 -0
  71. package/dist/chunk-2Q2SX2CS.mjs +365 -0
  72. package/dist/chunk-2TFX4ND3.mjs +13 -0
  73. package/dist/chunk-2TWPDSYD.mjs +87 -0
  74. package/dist/chunk-2W3DVD7S.mjs +647 -0
  75. package/dist/chunk-2ZFKXPQM.mjs +88 -0
  76. package/dist/chunk-3FA7FKAV.mjs +832 -0
  77. package/dist/chunk-3NZ2KMBL.mjs +58 -0
  78. package/dist/chunk-4MJLT6PZ.mjs +0 -0
  79. package/dist/chunk-56WO4WX7.mjs +0 -0
  80. package/dist/chunk-5APFUGAD.mjs +89 -0
  81. package/dist/chunk-5HMZ644B.mjs +108 -0
  82. package/dist/chunk-67GXH6PR.mjs +32 -0
  83. package/dist/chunk-6JNEPWRW.mjs +14368 -0
  84. package/dist/chunk-6NFHQIJD.mjs +45 -0
  85. package/dist/chunk-7P6ASYW6.mjs +9 -0
  86. package/dist/chunk-A3WPLSDT.mjs +1364 -0
  87. package/dist/chunk-AGJ6F2T3.mjs +144 -0
  88. package/dist/chunk-AK6Z23OX.mjs +1464 -0
  89. package/dist/chunk-APKKRD2G.mjs +102 -0
  90. package/dist/chunk-B2GV2BWH.mjs +73 -0
  91. package/dist/chunk-D5HQBNUB.mjs +74 -0
  92. package/dist/chunk-DNNG377Z.mjs +204 -0
  93. package/dist/chunk-DP3G27G5.mjs +135 -0
  94. package/dist/chunk-DV6WVX2Q.mjs +0 -0
  95. package/dist/chunk-DXGGXIUZ.mjs +57 -0
  96. package/dist/chunk-EGXBZCGC.mjs +943 -0
  97. package/dist/chunk-ERCNLX3V.mjs +176 -0
  98. package/dist/chunk-FQULBZ53.mjs +850 -0
  99. package/dist/chunk-G2AA4QLC.mjs +262 -0
  100. package/dist/chunk-GDBJ5JCU.mjs +488 -0
  101. package/dist/chunk-GJNSJU4S.mjs +19 -0
  102. package/dist/chunk-GZ6DCQKC.mjs +69 -0
  103. package/dist/chunk-H26B4FYG.mjs +167 -0
  104. package/dist/chunk-I4JMR3UR.mjs +21 -0
  105. package/dist/chunk-INV7QKLG.mjs +508 -0
  106. package/dist/chunk-IUDOC7N7.mjs +46 -0
  107. package/dist/chunk-IZWPRDC3.mjs +206 -0
  108. package/dist/chunk-KIMNCZGV.mjs +15 -0
  109. package/dist/chunk-L6HW2DA7.mjs +15 -0
  110. package/dist/chunk-LAZXX4HR.mjs +100 -0
  111. package/dist/chunk-LDKCUMHK.mjs +95 -0
  112. package/dist/chunk-LRXMECUA.mjs +0 -0
  113. package/dist/chunk-M52VMPGA.mjs +119 -0
  114. package/dist/chunk-MGUWEEI6.mjs +160 -0
  115. package/dist/chunk-NRUWQ5Z7.mjs +419 -0
  116. package/dist/chunk-NSEFNNU4.mjs +25360 -0
  117. package/dist/chunk-NTHVDFGO.mjs +138 -0
  118. package/dist/chunk-O3QHXMOX.mjs +3166 -0
  119. package/dist/chunk-P7NH2OSC.mjs +2605 -0
  120. package/dist/chunk-PKMABBB5.mjs +184 -0
  121. package/dist/chunk-PWS6XGJK.mjs +76 -0
  122. package/dist/chunk-R6JJQHFC.mjs +20 -0
  123. package/dist/chunk-RJLLGGPG.mjs +0 -0
  124. package/dist/chunk-SBACDPNX.mjs +689 -0
  125. package/dist/chunk-TO5AFLVQ.mjs +124 -0
  126. package/dist/chunk-TS7GHTG2.mjs +5436 -0
  127. package/dist/chunk-UJ2IMJ4W.mjs +133 -0
  128. package/dist/chunk-UOP63Q54.mjs +102 -0
  129. package/dist/chunk-UUOFWCM6.mjs +78 -0
  130. package/dist/chunk-V4EQTOA4.mjs +893 -0
  131. package/dist/chunk-VJ66NCL4.mjs +193 -0
  132. package/dist/chunk-VQJQHVEV.mjs +29 -0
  133. package/dist/chunk-VTJADRO3.mjs +141 -0
  134. package/dist/chunk-VWF3JO32.mjs +0 -0
  135. package/dist/chunk-W4MGXIRR.mjs +27 -0
  136. package/dist/chunk-W5KKPZT5.mjs +1204 -0
  137. package/dist/chunk-WD34YQ6T.mjs +381 -0
  138. package/dist/chunk-WZBYMYVW.mjs +14 -0
  139. package/dist/chunk-X23WKS3Z.mjs +50 -0
  140. package/dist/chunk-X7TXCYYN.mjs +6496 -0
  141. package/dist/chunk-XGI4EMS3.mjs +140 -0
  142. package/dist/chunk-XZKLBMN6.mjs +1153 -0
  143. package/dist/chunk-YB7INWPY.mjs +0 -0
  144. package/dist/chunk-YV4Y7SDL.mjs +83 -0
  145. package/dist/chunk-YZNBLFIW.mjs +1688 -0
  146. package/dist/chunk-YZZCTONM.mjs +263 -0
  147. package/dist/chunk-ZE6A3FYH.mjs +289 -0
  148. package/dist/cli/nextly.mjs +68 -0
  149. package/dist/cli/utils/index.d.ts +449 -0
  150. package/dist/cli/utils/index.mjs +49 -0
  151. package/dist/component-schema-service-5577KVW6.mjs +11 -0
  152. package/dist/config-loader-23YEMC3Z.mjs +23 -0
  153. package/dist/config.d.ts +44 -0
  154. package/dist/config.mjs +109 -0
  155. package/dist/container-ORGFGYSZ.mjs +9 -0
  156. package/dist/database/index.d.ts +12 -0
  157. package/dist/database/index.mjs +40 -0
  158. package/dist/database/seeders/index.d.ts +93 -0
  159. package/dist/database/seeders/index.mjs +47 -0
  160. package/dist/db-sync-demote-LJGKLB3S.mjs +117 -0
  161. package/dist/db-sync-promote-B26VSYQF.mjs +113 -0
  162. package/dist/dev-reload-broadcaster-B73IQ53V.mjs +25 -0
  163. package/dist/dist-M2NOU37V.mjs +19 -0
  164. package/dist/drizzle-kit-lazy-D2M2PXR2.mjs +13 -0
  165. package/dist/dynamic-collection-schema-service-IEXTPIZ7.mjs +8 -0
  166. package/dist/errors/index.d.ts +159 -0
  167. package/dist/errors/index.mjs +10 -0
  168. package/dist/factory-IWMBKUJM.mjs +15 -0
  169. package/dist/first-run-QIVKWJIF.mjs +63 -0
  170. package/dist/fresh-push-NR67DC3R.mjs +8 -0
  171. package/dist/index.d.ts +4175 -0
  172. package/dist/index.mjs +1336 -0
  173. package/dist/local-plugin-PTET4NAT.mjs +7 -0
  174. package/dist/logger-NU46DXNY.mjs +15 -0
  175. package/dist/logger-YE4TC7ZN.mjs +9 -0
  176. package/dist/migration-journal-EP532Y4L.mjs +139 -0
  177. package/dist/migrations/mysql/0000_eager_sentry.sql +174 -0
  178. package/dist/migrations/mysql/0001_soft_giant_girl.sql +27 -0
  179. package/dist/migrations/mysql/0002_media_table.sql +24 -0
  180. package/dist/migrations/mysql/0003_dynamic_singles.sql +37 -0
  181. package/dist/migrations/mysql/0004_dynamic_components.sql +35 -0
  182. package/dist/migrations/mysql/0005_user_management_tables.sql +92 -0
  183. package/dist/migrations/mysql/0006_api_keys.sql +36 -0
  184. package/dist/migrations/mysql/0007_general_settings.sql +20 -0
  185. package/dist/migrations/mysql/0008_site_settings_logo_url.sql +9 -0
  186. package/dist/migrations/mysql/0009_activity_log.sql +30 -0
  187. package/dist/migrations/mysql/0010_site_settings_sidebar.sql +13 -0
  188. package/dist/migrations/mysql/0011_missing_tables_and_columns.sql +54 -0
  189. package/dist/migrations/mysql/0012_image_sizes_and_focal_point.sql +30 -0
  190. package/dist/migrations/mysql/0012_media_folders.sql +43 -0
  191. package/dist/migrations/mysql/0013_user_brute_force_protection.sql +31 -0
  192. package/dist/migrations/mysql/0014_email_template_attachments.sql +12 -0
  193. package/dist/migrations/mysql/0015_media_uploaded_by_nullable.sql +15 -0
  194. package/dist/migrations/mysql/20260429_000000_000_initial_journal.sql +22 -0
  195. package/dist/migrations/mysql/20260501_000000_journal_batch.sql +17 -0
  196. package/dist/migrations/mysql/20260501_000001_audit_log.sql +24 -0
  197. package/dist/migrations/mysql/20260504_000000_nextly_meta.sql +21 -0
  198. package/dist/migrations/mysql/meta/0000_snapshot.json +1005 -0
  199. package/dist/migrations/mysql/meta/0001_snapshot.json +1099 -0
  200. package/dist/migrations/mysql/meta/_journal.json +41 -0
  201. package/dist/migrations/postgresql/0000_misty_king_bedlam.sql +169 -0
  202. package/dist/migrations/postgresql/0001_perpetual_captain_marvel.sql +8 -0
  203. package/dist/migrations/postgresql/0002_sad_spectrum.sql +16 -0
  204. package/dist/migrations/postgresql/0003_hesitant_ultron.sql +17 -0
  205. package/dist/migrations/postgresql/0004_media_table.sql +24 -0
  206. package/dist/migrations/postgresql/0005_media_folders.sql +36 -0
  207. package/dist/migrations/postgresql/0006_dynamic_collections_update.sql +50 -0
  208. package/dist/migrations/postgresql/0007_dynamic_singles.sql +38 -0
  209. package/dist/migrations/postgresql/0008_dynamic_components.sql +37 -0
  210. package/dist/migrations/postgresql/0009_user_management_tables.sql +95 -0
  211. package/dist/migrations/postgresql/0010_api_keys.sql +34 -0
  212. package/dist/migrations/postgresql/0011_general_settings.sql +20 -0
  213. package/dist/migrations/postgresql/0012_site_settings_logo_url.sql +9 -0
  214. package/dist/migrations/postgresql/0013_activity_log.sql +29 -0
  215. package/dist/migrations/postgresql/0014_image_sizes_and_focal_point.sql +33 -0
  216. package/dist/migrations/postgresql/0014_site_settings_sidebar.sql +13 -0
  217. package/dist/migrations/postgresql/0015_user_brute_force_protection.sql +29 -0
  218. package/dist/migrations/postgresql/0016_email_template_attachments.sql +12 -0
  219. package/dist/migrations/postgresql/0017_media_uploaded_by_nullable.sql +15 -0
  220. package/dist/migrations/postgresql/20260429_000000_000_initial_journal.sql +24 -0
  221. package/dist/migrations/postgresql/20260501_000000_journal_batch.sql +17 -0
  222. package/dist/migrations/postgresql/20260501_000001_audit_log.sql +24 -0
  223. package/dist/migrations/postgresql/20260504_000000_nextly_meta.sql +22 -0
  224. package/dist/migrations/postgresql/meta/0000_snapshot.json +1286 -0
  225. package/dist/migrations/postgresql/meta/0001_snapshot.json +1407 -0
  226. package/dist/migrations/postgresql/meta/0002_snapshot.json +1552 -0
  227. package/dist/migrations/postgresql/meta/0003_snapshot.json +1695 -0
  228. package/dist/migrations/postgresql/meta/0010_snapshot.json +2345 -0
  229. package/dist/migrations/postgresql/meta/_journal.json +90 -0
  230. package/dist/migrations/sqlite/0000_api_keys.sql +34 -0
  231. package/dist/migrations/sqlite/0001_general_settings.sql +20 -0
  232. package/dist/migrations/sqlite/0002_site_settings_logo_url.sql +9 -0
  233. package/dist/migrations/sqlite/0003_activity_log.sql +29 -0
  234. package/dist/migrations/sqlite/0004_image_sizes_and_focal_point.sql +29 -0
  235. package/dist/migrations/sqlite/0004_site_settings_sidebar.sql +11 -0
  236. package/dist/migrations/sqlite/0005_user_brute_force_protection.sql +29 -0
  237. package/dist/migrations/sqlite/0006_email_template_attachments.sql +12 -0
  238. package/dist/migrations/sqlite/0007_media_uploaded_by_nullable.sql +111 -0
  239. package/dist/migrations/sqlite/20260429_000000_000_initial_journal.sql +24 -0
  240. package/dist/migrations/sqlite/20260501_000000_journal_batch.sql +19 -0
  241. package/dist/migrations/sqlite/20260501_000001_audit_log.sql +24 -0
  242. package/dist/migrations/sqlite/20260504_000000_nextly_meta.sql +21 -0
  243. package/dist/migrations/sqlite/20260505_000000_user_management_tables.sql +77 -0
  244. package/dist/next.d.ts +57 -0
  245. package/dist/next.mjs +55 -0
  246. package/dist/observability/index.d.ts +87 -0
  247. package/dist/observability/index.mjs +57 -0
  248. package/dist/permissions-3DZZQZMI.mjs +39 -0
  249. package/dist/pipeline-YOML7SWF.mjs +29 -0
  250. package/dist/preview-ZZTR3QGS.mjs +9 -0
  251. package/dist/program-PW6UB2ZC.mjs +5934 -0
  252. package/dist/reconcile-single-tables-7ENVXJGB.mjs +7 -0
  253. package/dist/register-SF6E6FVU.mjs +49 -0
  254. package/dist/reload-config-HWQ4G5MM.mjs +23 -0
  255. package/dist/resolve-single-table-name-JSOMUB3R.mjs +7 -0
  256. package/dist/routeHandler-UNMMJIBM.mjs +77 -0
  257. package/dist/runtime-schema-generator-NRA6A6Z6.mjs +8 -0
  258. package/dist/runtime.d.ts +120 -0
  259. package/dist/runtime.mjs +73 -0
  260. package/dist/schema-hash-FMMG6VPJ.mjs +13 -0
  261. package/dist/schema-registry-EQ36FZDP.mjs +7 -0
  262. package/dist/scripts/load-env.mjs +42 -0
  263. package/dist/storage/index.d.ts +566 -0
  264. package/dist/storage/index.mjs +45 -0
  265. package/dist/super-admin-G5ZK5F4T.mjs +39 -0
  266. package/dist/system-table-service-WGSRVEGT.mjs +17 -0
  267. package/dist/users-7KELGRYJ.mjs +38 -0
  268. package/package.json +308 -9
@@ -0,0 +1,41 @@
1
+ {
2
+ "version": "7",
3
+ "dialect": "mysql",
4
+ "entries": [
5
+ {
6
+ "idx": 0,
7
+ "version": "5",
8
+ "when": 1763195298918,
9
+ "tag": "0000_eager_sentry",
10
+ "breakpoints": true
11
+ },
12
+ {
13
+ "idx": 1,
14
+ "version": "5",
15
+ "when": 1763206223302,
16
+ "tag": "0001_soft_giant_girl",
17
+ "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "5",
22
+ "when": 1763298000000,
23
+ "tag": "0002_media_table",
24
+ "breakpoints": true
25
+ },
26
+ {
27
+ "idx": 6,
28
+ "version": "7",
29
+ "when": 1771408301715,
30
+ "tag": "0006_api_keys",
31
+ "breakpoints": true
32
+ },
33
+ {
34
+ "idx": 7,
35
+ "version": "7",
36
+ "when": 1741190400000,
37
+ "tag": "0009_activity_log",
38
+ "breakpoints": true
39
+ }
40
+ ]
41
+ }
@@ -0,0 +1,169 @@
1
+ CREATE TABLE "accounts" (
2
+ "id" serial PRIMARY KEY NOT NULL,
3
+ "user_id" text NOT NULL,
4
+ "type" text NOT NULL,
5
+ "provider" text NOT NULL,
6
+ "provider_account_id" text NOT NULL,
7
+ "refresh_token" text,
8
+ "access_token" text,
9
+ "expires_at" integer,
10
+ "token_type" text,
11
+ "scope" text,
12
+ "id_token" text,
13
+ "session_state" text,
14
+ "created_at" timestamp DEFAULT now() NOT NULL,
15
+ "updated_at" timestamp DEFAULT now() NOT NULL
16
+ );
17
+ --> statement-breakpoint
18
+ CREATE TABLE "content_schema_events" (
19
+ "id" serial PRIMARY KEY NOT NULL,
20
+ "op" text NOT NULL,
21
+ "table_name" text NOT NULL,
22
+ "sql" text NOT NULL,
23
+ "meta" jsonb,
24
+ "created_at" timestamp DEFAULT now() NOT NULL
25
+ );
26
+ --> statement-breakpoint
27
+ CREATE TABLE "dynamic_collections" (
28
+ "id" text PRIMARY KEY NOT NULL,
29
+ "name" varchar(255) NOT NULL,
30
+ "label" varchar(255) NOT NULL,
31
+ "table_name" varchar(255) NOT NULL,
32
+ "description" text,
33
+ "icon" varchar(50),
34
+ "schema_definition" jsonb NOT NULL,
35
+ "created_by" text,
36
+ "created_at" timestamp DEFAULT now() NOT NULL,
37
+ "updated_at" timestamp DEFAULT now() NOT NULL,
38
+ CONSTRAINT "dynamic_collections_name_unique" UNIQUE("name"),
39
+ CONSTRAINT "dynamic_collections_table_name_unique" UNIQUE("table_name")
40
+ );
41
+ --> statement-breakpoint
42
+ CREATE TABLE "email_verification_tokens" (
43
+ "id" serial PRIMARY KEY NOT NULL,
44
+ "identifier" text NOT NULL,
45
+ "token_hash" text NOT NULL,
46
+ "expires" timestamp NOT NULL,
47
+ "created_at" timestamp DEFAULT now() NOT NULL
48
+ );
49
+ --> statement-breakpoint
50
+ CREATE TABLE "example_users" (
51
+ "id" serial PRIMARY KEY NOT NULL,
52
+ "name" text
53
+ );
54
+ --> statement-breakpoint
55
+ CREATE TABLE "password_reset_tokens" (
56
+ "id" serial PRIMARY KEY NOT NULL,
57
+ "identifier" text NOT NULL,
58
+ "token_hash" text NOT NULL,
59
+ "expires" timestamp NOT NULL,
60
+ "used_at" timestamp,
61
+ "created_at" timestamp DEFAULT now() NOT NULL
62
+ );
63
+ --> statement-breakpoint
64
+ CREATE TABLE "permissions" (
65
+ "id" text PRIMARY KEY NOT NULL,
66
+ "name" varchar(100) NOT NULL,
67
+ "slug" varchar(100) NOT NULL,
68
+ "action" varchar(50) NOT NULL,
69
+ "resource" varchar(50) NOT NULL,
70
+ "description" varchar(255),
71
+ "created_at" timestamp DEFAULT now() NOT NULL,
72
+ "updated_at" timestamp DEFAULT now() NOT NULL
73
+ );
74
+ --> statement-breakpoint
75
+ CREATE TABLE "role_inherits" (
76
+ "id" text PRIMARY KEY NOT NULL,
77
+ "parent_role_id" text NOT NULL,
78
+ "child_role_id" text NOT NULL
79
+ );
80
+ --> statement-breakpoint
81
+ CREATE TABLE "role_permissions" (
82
+ "id" text PRIMARY KEY NOT NULL,
83
+ "role_id" text NOT NULL,
84
+ "permission_id" text NOT NULL,
85
+ "created_at" timestamp DEFAULT now() NOT NULL
86
+ );
87
+ --> statement-breakpoint
88
+ CREATE TABLE "roles" (
89
+ "id" text PRIMARY KEY NOT NULL,
90
+ "name" varchar(50) NOT NULL,
91
+ "slug" varchar(50) NOT NULL,
92
+ "description" varchar(255),
93
+ "level" integer DEFAULT 0 NOT NULL,
94
+ "is_system" boolean DEFAULT false NOT NULL,
95
+ "created_at" timestamp DEFAULT now() NOT NULL,
96
+ "updated_at" timestamp DEFAULT now() NOT NULL
97
+ );
98
+ --> statement-breakpoint
99
+ CREATE TABLE "sessions" (
100
+ "session_token" text PRIMARY KEY NOT NULL,
101
+ "user_id" text NOT NULL,
102
+ "expires" timestamp NOT NULL
103
+ );
104
+ --> statement-breakpoint
105
+ CREATE TABLE "system_migrations" (
106
+ "id" serial PRIMARY KEY NOT NULL,
107
+ "name" text NOT NULL,
108
+ "run_at" timestamp DEFAULT now() NOT NULL
109
+ );
110
+ --> statement-breakpoint
111
+ CREATE TABLE "user_roles" (
112
+ "id" text PRIMARY KEY NOT NULL,
113
+ "user_id" text NOT NULL,
114
+ "role_id" text NOT NULL,
115
+ "created_at" timestamp DEFAULT now() NOT NULL,
116
+ "expires_at" timestamp
117
+ );
118
+ --> statement-breakpoint
119
+ CREATE TABLE "users" (
120
+ "id" text PRIMARY KEY NOT NULL,
121
+ "name" text,
122
+ "email" text NOT NULL,
123
+ "email_verified" timestamp,
124
+ "password_updated_at" timestamp,
125
+ "image" text,
126
+ "password_hash" text NOT NULL,
127
+ "is_active" boolean DEFAULT false NOT NULL,
128
+ "created_at" timestamp DEFAULT now() NOT NULL,
129
+ "updated_at" timestamp DEFAULT now() NOT NULL
130
+ );
131
+ --> statement-breakpoint
132
+ CREATE TABLE "verification_tokens" (
133
+ "identifier" text NOT NULL,
134
+ "token" text NOT NULL,
135
+ "expires" timestamp NOT NULL
136
+ );
137
+ --> statement-breakpoint
138
+ ALTER TABLE "dynamic_collections" ADD CONSTRAINT "dynamic_collections_created_by_users_id_fk" FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
139
+ ALTER TABLE "role_inherits" ADD CONSTRAINT "role_inherits_parent_role_id_roles_id_fk" FOREIGN KEY ("parent_role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
140
+ ALTER TABLE "role_inherits" ADD CONSTRAINT "role_inherits_child_role_id_roles_id_fk" FOREIGN KEY ("child_role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
141
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
142
+ ALTER TABLE "role_permissions" ADD CONSTRAINT "role_permissions_permission_id_permissions_id_fk" FOREIGN KEY ("permission_id") REFERENCES "public"."permissions"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
143
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
144
+ ALTER TABLE "user_roles" ADD CONSTRAINT "user_roles_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
145
+ CREATE UNIQUE INDEX "accounts_provider_providerAccountId_unique" ON "accounts" USING btree ("provider","provider_account_id");--> statement-breakpoint
146
+ CREATE INDEX "accounts_user_id_idx" ON "accounts" USING btree ("user_id");--> statement-breakpoint
147
+ CREATE INDEX "content_schema_events_created_at_idx" ON "content_schema_events" USING btree ("created_at");--> statement-breakpoint
148
+ CREATE INDEX "content_schema_events_table_name_idx" ON "content_schema_events" USING btree ("table_name");--> statement-breakpoint
149
+ CREATE UNIQUE INDEX "evt_identifier_token_hash_unique" ON "email_verification_tokens" USING btree ("identifier","token_hash");--> statement-breakpoint
150
+ CREATE INDEX "evt_expires_idx" ON "email_verification_tokens" USING btree ("expires");--> statement-breakpoint
151
+ CREATE UNIQUE INDEX "prt_identifier_token_hash_unique" ON "password_reset_tokens" USING btree ("identifier","token_hash");--> statement-breakpoint
152
+ CREATE INDEX "prt_expires_idx" ON "password_reset_tokens" USING btree ("expires");--> statement-breakpoint
153
+ CREATE INDEX "prt_used_at_idx" ON "password_reset_tokens" USING btree ("used_at");--> statement-breakpoint
154
+ CREATE UNIQUE INDEX "permissions_action_resource_unique" ON "permissions" USING btree ("action","resource");--> statement-breakpoint
155
+ CREATE UNIQUE INDEX "permissions_slug_unique" ON "permissions" USING btree ("slug");--> statement-breakpoint
156
+ CREATE INDEX "permissions_resource_idx" ON "permissions" USING btree ("resource");--> statement-breakpoint
157
+ CREATE UNIQUE INDEX "role_inherits_parent_child_unique" ON "role_inherits" USING btree ("parent_role_id","child_role_id");--> statement-breakpoint
158
+ CREATE INDEX "role_inherits_child_idx" ON "role_inherits" USING btree ("child_role_id");--> statement-breakpoint
159
+ CREATE UNIQUE INDEX "role_permissions_role_permission_unique" ON "role_permissions" USING btree ("role_id","permission_id");--> statement-breakpoint
160
+ CREATE INDEX "role_permissions_role_id_idx" ON "role_permissions" USING btree ("role_id");--> statement-breakpoint
161
+ CREATE UNIQUE INDEX "roles_name_unique" ON "roles" USING btree ("name");--> statement-breakpoint
162
+ CREATE UNIQUE INDEX "roles_slug_unique" ON "roles" USING btree ("slug");--> statement-breakpoint
163
+ CREATE INDEX "sessions_user_id_idx" ON "sessions" USING btree ("user_id");--> statement-breakpoint
164
+ CREATE UNIQUE INDEX "user_roles_user_role_unique" ON "user_roles" USING btree ("user_id","role_id");--> statement-breakpoint
165
+ CREATE INDEX "user_roles_user_id_idx" ON "user_roles" USING btree ("user_id");--> statement-breakpoint
166
+ CREATE UNIQUE INDEX "users_email_unique" ON "users" USING btree ("email");--> statement-breakpoint
167
+ CREATE INDEX "users_created_at_idx" ON "users" USING btree ("created_at");--> statement-breakpoint
168
+ CREATE UNIQUE INDEX "verification_tokens_identifier_token_pk" ON "verification_tokens" USING btree ("identifier","token");--> statement-breakpoint
169
+ CREATE INDEX "verification_tokens_token_idx" ON "verification_tokens" USING btree ("token");
@@ -0,0 +1,8 @@
1
+ CREATE INDEX "dynamic_collections_created_by_idx" ON "dynamic_collections" USING btree ("created_by");--> statement-breakpoint
2
+ CREATE INDEX "dynamic_collections_created_at_idx" ON "dynamic_collections" USING btree ("created_at");--> statement-breakpoint
3
+ CREATE INDEX "dynamic_collections_updated_at_idx" ON "dynamic_collections" USING btree ("updated_at");--> statement-breakpoint
4
+ CREATE INDEX "permissions_action_idx" ON "permissions" USING btree ("action");--> statement-breakpoint
5
+ CREATE INDEX "role_inherits_parent_idx" ON "role_inherits" USING btree ("parent_role_id");--> statement-breakpoint
6
+ CREATE INDEX "roles_level_idx" ON "roles" USING btree ("level");--> statement-breakpoint
7
+ CREATE INDEX "roles_is_system_idx" ON "roles" USING btree ("is_system");--> statement-breakpoint
8
+ CREATE INDEX "user_roles_expires_at_idx" ON "user_roles" USING btree ("expires_at");
@@ -0,0 +1,16 @@
1
+ CREATE TABLE "user_permission_cache" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "user_id" text NOT NULL,
4
+ "action" varchar(50) NOT NULL,
5
+ "resource" varchar(100) NOT NULL,
6
+ "has_permission" boolean NOT NULL,
7
+ "role_ids" jsonb NOT NULL,
8
+ "expires_at" timestamp NOT NULL,
9
+ "created_at" timestamp DEFAULT now() NOT NULL
10
+ );
11
+ --> statement-breakpoint
12
+ ALTER TABLE "user_permission_cache" ADD CONSTRAINT "user_permission_cache_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
13
+ CREATE INDEX "upc_user_id_idx" ON "user_permission_cache" USING btree ("user_id");--> statement-breakpoint
14
+ CREATE INDEX "upc_expires_at_idx" ON "user_permission_cache" USING btree ("expires_at");--> statement-breakpoint
15
+ CREATE INDEX "upc_user_action_resource_idx" ON "user_permission_cache" USING btree ("user_id","action","resource");--> statement-breakpoint
16
+ CREATE INDEX "upc_role_ids_gin_idx" ON "user_permission_cache" USING gin ("role_ids");
@@ -0,0 +1,17 @@
1
+ CREATE TABLE "field_permissions" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "role_id" text NOT NULL,
4
+ "collection_slug" varchar(100) NOT NULL,
5
+ "field_path" varchar(255) NOT NULL,
6
+ "action" varchar(10) NOT NULL,
7
+ "condition" jsonb,
8
+ "created_at" timestamp DEFAULT now() NOT NULL,
9
+ "updated_at" timestamp DEFAULT now() NOT NULL
10
+ );
11
+ --> statement-breakpoint
12
+ DROP INDEX IF EXISTS "upc_created_at_idx";--> statement-breakpoint
13
+ ALTER TABLE "field_permissions" ADD CONSTRAINT "field_permissions_role_id_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
14
+ CREATE UNIQUE INDEX "field_permissions_role_collection_field_unique" ON "field_permissions" USING btree ("role_id","collection_slug","field_path");--> statement-breakpoint
15
+ CREATE INDEX "field_permissions_role_id_idx" ON "field_permissions" USING btree ("role_id");--> statement-breakpoint
16
+ CREATE INDEX "field_permissions_collection_idx" ON "field_permissions" USING btree ("collection_slug");--> statement-breakpoint
17
+ CREATE INDEX "field_permissions_lookup_idx" ON "field_permissions" USING btree ("role_id","collection_slug","field_path");
@@ -0,0 +1,24 @@
1
+ CREATE TABLE "media" (
2
+ "id" text PRIMARY KEY NOT NULL,
3
+ "filename" varchar(255) NOT NULL,
4
+ "original_filename" varchar(255) NOT NULL,
5
+ "mime_type" varchar(100) NOT NULL,
6
+ "size" integer NOT NULL,
7
+ "width" integer,
8
+ "height" integer,
9
+ "duration" integer,
10
+ "url" text NOT NULL,
11
+ "thumbnail_url" text,
12
+ "alt_text" text,
13
+ "caption" text,
14
+ "tags" text[],
15
+ "uploaded_by" text NOT NULL,
16
+ "uploaded_at" timestamp DEFAULT now() NOT NULL,
17
+ "updated_at" timestamp DEFAULT now() NOT NULL
18
+ );
19
+ --> statement-breakpoint
20
+ ALTER TABLE "media" ADD CONSTRAINT "media_uploaded_by_users_id_fk" FOREIGN KEY ("uploaded_by") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
21
+ CREATE INDEX "media_uploaded_by_idx" ON "media" USING btree ("uploaded_by");--> statement-breakpoint
22
+ CREATE INDEX "media_mime_type_idx" ON "media" USING btree ("mime_type");--> statement-breakpoint
23
+ CREATE INDEX "media_uploaded_at_idx" ON "media" USING btree ("uploaded_at");--> statement-breakpoint
24
+ CREATE INDEX "media_tags_idx" ON "media" USING btree ("tags");
@@ -0,0 +1,36 @@
1
+ -- Migration: Add media folders support
2
+ -- Date: 2025-11-16
3
+ -- Description: Adds media_folders table and folder_id column to media table
4
+
5
+ -- Create media_folders table
6
+ CREATE TABLE "media_folders" (
7
+ "id" text PRIMARY KEY NOT NULL,
8
+ "name" varchar(255) NOT NULL,
9
+ "description" text,
10
+ "parent_id" text,
11
+ "created_by" text NOT NULL,
12
+ "created_at" timestamp DEFAULT now() NOT NULL,
13
+ "updated_at" timestamp DEFAULT now() NOT NULL
14
+ );
15
+
16
+ -- Add foreign key constraints for media_folders
17
+ ALTER TABLE "media_folders" ADD CONSTRAINT "media_folders_parent_id_media_folders_id_fk"
18
+ FOREIGN KEY ("parent_id") REFERENCES "public"."media_folders"("id") ON DELETE cascade ON UPDATE no action;
19
+
20
+ ALTER TABLE "media_folders" ADD CONSTRAINT "media_folders_created_by_users_id_fk"
21
+ FOREIGN KEY ("created_by") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
22
+
23
+ -- Create indexes for media_folders
24
+ CREATE INDEX "media_folders_parent_id_idx" ON "media_folders" USING btree ("parent_id");
25
+ CREATE INDEX "media_folders_created_by_idx" ON "media_folders" USING btree ("created_by");
26
+ CREATE INDEX "media_folders_created_at_idx" ON "media_folders" USING btree ("created_at");
27
+
28
+ -- Add folder_id column to media table
29
+ ALTER TABLE "media" ADD COLUMN "folder_id" text;
30
+
31
+ -- Add foreign key constraint for media.folder_id
32
+ ALTER TABLE "media" ADD CONSTRAINT "media_folder_id_media_folders_id_fk"
33
+ FOREIGN KEY ("folder_id") REFERENCES "public"."media_folders"("id") ON DELETE set null ON UPDATE no action;
34
+
35
+ -- Create index for media.folder_id
36
+ CREATE INDEX "media_folder_id_idx" ON "media" USING btree ("folder_id");
@@ -0,0 +1,50 @@
1
+ -- Migration: Update dynamic_collections table schema
2
+ -- This migration updates the dynamic_collections table to the new schema format
3
+
4
+ -- Step 1: Add new columns
5
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "slug" varchar(100);
6
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "labels" jsonb;
7
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "fields" jsonb;
8
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "timestamps" boolean DEFAULT true NOT NULL;
9
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "admin" jsonb;
10
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "source" varchar(20) DEFAULT 'ui' NOT NULL;
11
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "locked" boolean DEFAULT false NOT NULL;
12
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "config_path" varchar(500);
13
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "schema_hash" varchar(64);
14
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "schema_version" integer DEFAULT 1 NOT NULL;
15
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "migration_status" varchar(20) DEFAULT 'pending' NOT NULL;
16
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "last_migration_id" varchar(100);
17
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "access_rules" jsonb;
18
+ ALTER TABLE "dynamic_collections" ADD COLUMN IF NOT EXISTS "hooks" jsonb;
19
+ --> statement-breakpoint
20
+
21
+ -- Step 2: Migrate data from old columns to new columns
22
+ UPDATE "dynamic_collections"
23
+ SET
24
+ "slug" = COALESCE("name", "id"),
25
+ "labels" = jsonb_build_object('singular', COALESCE("label", "name"), 'plural', COALESCE("label", "name") || 's'),
26
+ "fields" = COALESCE("schema_definition", '[]'::jsonb),
27
+ "schema_hash" = md5("schema_definition"::text)
28
+ WHERE "slug" IS NULL;
29
+ --> statement-breakpoint
30
+
31
+ -- Step 3: Make required columns NOT NULL after data migration
32
+ ALTER TABLE "dynamic_collections" ALTER COLUMN "slug" SET NOT NULL;
33
+ ALTER TABLE "dynamic_collections" ALTER COLUMN "labels" SET NOT NULL;
34
+ ALTER TABLE "dynamic_collections" ALTER COLUMN "fields" SET NOT NULL;
35
+ ALTER TABLE "dynamic_collections" ALTER COLUMN "schema_hash" SET NOT NULL;
36
+ --> statement-breakpoint
37
+
38
+ -- Step 4: Add unique constraint on slug
39
+ CREATE UNIQUE INDEX IF NOT EXISTS "dynamic_collections_slug_unique" ON "dynamic_collections" USING btree ("slug");
40
+ --> statement-breakpoint
41
+
42
+ -- Step 5: Add source index
43
+ CREATE INDEX IF NOT EXISTS "dynamic_collections_source_idx" ON "dynamic_collections" USING btree ("source");
44
+ --> statement-breakpoint
45
+
46
+ -- Step 6: Drop old columns that are no longer needed
47
+ ALTER TABLE "dynamic_collections" DROP COLUMN IF EXISTS "name";
48
+ ALTER TABLE "dynamic_collections" DROP COLUMN IF EXISTS "label";
49
+ ALTER TABLE "dynamic_collections" DROP COLUMN IF EXISTS "icon";
50
+ ALTER TABLE "dynamic_collections" DROP COLUMN IF EXISTS "schema_definition";
@@ -0,0 +1,38 @@
1
+ -- Migration: Create dynamic_singles table
2
+ -- This migration creates the dynamic_singles table for storing Singles (Globals) metadata
3
+ -- Singles are single-document entities for site-wide configuration (site settings, navigation, etc.)
4
+
5
+ CREATE TABLE IF NOT EXISTS "dynamic_singles" (
6
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ "slug" varchar(255) NOT NULL,
8
+ "label" varchar(255) NOT NULL,
9
+ "table_name" varchar(255) NOT NULL,
10
+ "description" text,
11
+ "fields" jsonb NOT NULL,
12
+ "admin" jsonb,
13
+ "access_rules" jsonb,
14
+ "source" varchar(20) DEFAULT 'ui' NOT NULL,
15
+ "locked" boolean DEFAULT false NOT NULL,
16
+ "config_path" varchar(500),
17
+ "schema_hash" varchar(64) NOT NULL,
18
+ "schema_version" integer DEFAULT 1 NOT NULL,
19
+ "migration_status" varchar(20) DEFAULT 'pending' NOT NULL,
20
+ "last_migration_id" uuid,
21
+ "created_by" uuid,
22
+ "created_at" timestamp DEFAULT now() NOT NULL,
23
+ "updated_at" timestamp DEFAULT now() NOT NULL,
24
+ CONSTRAINT "dynamic_singles_slug_unique" UNIQUE("slug"),
25
+ CONSTRAINT "dynamic_singles_table_name_unique" UNIQUE("table_name")
26
+ );
27
+ --> statement-breakpoint
28
+
29
+ -- Create indexes for query performance
30
+ CREATE INDEX IF NOT EXISTS "dynamic_singles_source_idx" ON "dynamic_singles" USING btree ("source");
31
+ --> statement-breakpoint
32
+ CREATE INDEX IF NOT EXISTS "dynamic_singles_migration_status_idx" ON "dynamic_singles" USING btree ("migration_status");
33
+ --> statement-breakpoint
34
+ CREATE INDEX IF NOT EXISTS "dynamic_singles_created_by_idx" ON "dynamic_singles" USING btree ("created_by");
35
+ --> statement-breakpoint
36
+ CREATE INDEX IF NOT EXISTS "dynamic_singles_created_at_idx" ON "dynamic_singles" USING btree ("created_at");
37
+ --> statement-breakpoint
38
+ CREATE INDEX IF NOT EXISTS "dynamic_singles_updated_at_idx" ON "dynamic_singles" USING btree ("updated_at");
@@ -0,0 +1,37 @@
1
+ -- Migration: Create dynamic_components table
2
+ -- This migration creates the dynamic_components table for storing Component metadata
3
+ -- Components are reusable field group templates that can be embedded in Collections and Singles
4
+
5
+ CREATE TABLE IF NOT EXISTS "dynamic_components" (
6
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ "slug" varchar(255) NOT NULL,
8
+ "label" varchar(255) NOT NULL,
9
+ "table_name" varchar(255) NOT NULL,
10
+ "description" text,
11
+ "fields" jsonb NOT NULL,
12
+ "admin" jsonb,
13
+ "source" varchar(20) DEFAULT 'ui' NOT NULL,
14
+ "locked" boolean DEFAULT false NOT NULL,
15
+ "config_path" varchar(500),
16
+ "schema_hash" varchar(64) NOT NULL,
17
+ "schema_version" integer DEFAULT 1 NOT NULL,
18
+ "migration_status" varchar(20) DEFAULT 'pending' NOT NULL,
19
+ "last_migration_id" uuid,
20
+ "created_by" uuid,
21
+ "created_at" timestamp DEFAULT now() NOT NULL,
22
+ "updated_at" timestamp DEFAULT now() NOT NULL,
23
+ CONSTRAINT "dynamic_components_slug_unique" UNIQUE("slug"),
24
+ CONSTRAINT "dynamic_components_table_name_unique" UNIQUE("table_name")
25
+ );
26
+ --> statement-breakpoint
27
+
28
+ -- Create indexes for query performance
29
+ CREATE INDEX IF NOT EXISTS "dynamic_components_source_idx" ON "dynamic_components" USING btree ("source");
30
+ --> statement-breakpoint
31
+ CREATE INDEX IF NOT EXISTS "dynamic_components_migration_status_idx" ON "dynamic_components" USING btree ("migration_status");
32
+ --> statement-breakpoint
33
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_by_idx" ON "dynamic_components" USING btree ("created_by");
34
+ --> statement-breakpoint
35
+ CREATE INDEX IF NOT EXISTS "dynamic_components_created_at_idx" ON "dynamic_components" USING btree ("created_at");
36
+ --> statement-breakpoint
37
+ CREATE INDEX IF NOT EXISTS "dynamic_components_updated_at_idx" ON "dynamic_components" USING btree ("updated_at");
@@ -0,0 +1,95 @@
1
+ -- Migration: Create Plan 12 system tables
2
+ -- This migration creates the user_field_definitions, email_providers, and email_templates
3
+ -- tables required by the User Management & Extendable User Schema feature (Plan 12).
4
+
5
+ -- ============================================================
6
+ -- user_field_definitions
7
+ -- Stores metadata for custom user fields that extend the base user model.
8
+ -- Fields can be sourced from defineConfig() (code) or admin Settings UI (ui).
9
+ -- ============================================================
10
+
11
+ CREATE TABLE IF NOT EXISTS "user_field_definitions" (
12
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
13
+ "name" varchar(255) NOT NULL,
14
+ "label" varchar(255) NOT NULL,
15
+ "type" varchar(50) NOT NULL,
16
+ "required" boolean NOT NULL DEFAULT false,
17
+ "default_value" varchar(255),
18
+ "options" jsonb,
19
+ "placeholder" varchar(255),
20
+ "description" text,
21
+ "sort_order" integer NOT NULL DEFAULT 0,
22
+ "source" varchar(10) NOT NULL DEFAULT 'ui',
23
+ "is_active" boolean NOT NULL DEFAULT true,
24
+ "created_at" timestamp DEFAULT now() NOT NULL,
25
+ "updated_at" timestamp DEFAULT now() NOT NULL
26
+ );
27
+ --> statement-breakpoint
28
+
29
+ CREATE UNIQUE INDEX IF NOT EXISTS "user_field_defs_name_unique_idx" ON "user_field_definitions" USING btree ("name");
30
+ --> statement-breakpoint
31
+ CREATE INDEX IF NOT EXISTS "user_field_defs_source_idx" ON "user_field_definitions" USING btree ("source");
32
+ --> statement-breakpoint
33
+ CREATE INDEX IF NOT EXISTS "user_field_defs_is_active_idx" ON "user_field_definitions" USING btree ("is_active");
34
+ --> statement-breakpoint
35
+ CREATE INDEX IF NOT EXISTS "user_field_defs_sort_order_idx" ON "user_field_definitions" USING btree ("sort_order");
36
+ --> statement-breakpoint
37
+ CREATE INDEX IF NOT EXISTS "user_field_defs_created_at_idx" ON "user_field_definitions" USING btree ("created_at");
38
+ --> statement-breakpoint
39
+
40
+ -- ============================================================
41
+ -- email_providers
42
+ -- Stores email provider configurations (SMTP, Resend, SendLayer)
43
+ -- managed via the admin Settings UI.
44
+ -- ============================================================
45
+
46
+ CREATE TABLE IF NOT EXISTS "email_providers" (
47
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
48
+ "name" varchar(255) NOT NULL,
49
+ "type" varchar(50) NOT NULL,
50
+ "from_email" varchar(255) NOT NULL,
51
+ "from_name" varchar(255),
52
+ "configuration" jsonb NOT NULL,
53
+ "is_default" boolean NOT NULL DEFAULT false,
54
+ "is_active" boolean NOT NULL DEFAULT true,
55
+ "created_at" timestamp DEFAULT now() NOT NULL,
56
+ "updated_at" timestamp DEFAULT now() NOT NULL
57
+ );
58
+ --> statement-breakpoint
59
+
60
+ CREATE INDEX IF NOT EXISTS "email_providers_type_idx" ON "email_providers" USING btree ("type");
61
+ --> statement-breakpoint
62
+ CREATE UNIQUE INDEX IF NOT EXISTS "email_providers_default_unique_idx" ON "email_providers" ("is_default") WHERE "is_default" = true;
63
+ --> statement-breakpoint
64
+ CREATE INDEX IF NOT EXISTS "email_providers_is_active_idx" ON "email_providers" USING btree ("is_active");
65
+ --> statement-breakpoint
66
+ CREATE INDEX IF NOT EXISTS "email_providers_created_at_idx" ON "email_providers" USING btree ("created_at");
67
+ --> statement-breakpoint
68
+
69
+ -- ============================================================
70
+ -- email_templates
71
+ -- Stores email templates with {{variable}} interpolation support,
72
+ -- managed via the admin Settings UI.
73
+ -- ============================================================
74
+
75
+ CREATE TABLE IF NOT EXISTS "email_templates" (
76
+ "id" uuid PRIMARY KEY DEFAULT gen_random_uuid(),
77
+ "name" varchar(255) NOT NULL,
78
+ "slug" varchar(255) NOT NULL UNIQUE,
79
+ "subject" text NOT NULL,
80
+ "html_content" text NOT NULL,
81
+ "plain_text_content" text,
82
+ "variables" jsonb,
83
+ "use_layout" boolean NOT NULL DEFAULT true,
84
+ "is_active" boolean NOT NULL DEFAULT true,
85
+ "provider_id" uuid,
86
+ "created_at" timestamp DEFAULT now() NOT NULL,
87
+ "updated_at" timestamp DEFAULT now() NOT NULL
88
+ );
89
+ --> statement-breakpoint
90
+
91
+ CREATE INDEX IF NOT EXISTS "email_templates_is_active_idx" ON "email_templates" USING btree ("is_active");
92
+ --> statement-breakpoint
93
+ CREATE INDEX IF NOT EXISTS "email_templates_provider_id_idx" ON "email_templates" USING btree ("provider_id");
94
+ --> statement-breakpoint
95
+ CREATE INDEX IF NOT EXISTS "email_templates_created_at_idx" ON "email_templates" USING btree ("created_at");
@@ -0,0 +1,34 @@
1
+ -- Migration: Create api_keys table for API Key Authentication (Plan 14)
2
+ -- This migration creates the api_keys table required for programmatic API access
3
+ -- using long-lived secret keys with SHA-256 hashed storage.
4
+
5
+ -- UP
6
+
7
+ CREATE TABLE IF NOT EXISTS "api_keys" (
8
+ "id" text PRIMARY KEY NOT NULL,
9
+ "name" varchar(255) NOT NULL,
10
+ "description" text,
11
+ "key_hash" varchar(64) NOT NULL,
12
+ "key_prefix" varchar(16) NOT NULL,
13
+ "token_type" varchar(20) NOT NULL,
14
+ "role_id" text REFERENCES "roles"("id") ON DELETE SET NULL,
15
+ "user_id" text NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
16
+ "expires_at" timestamp,
17
+ "last_used_at" timestamp,
18
+ "is_active" boolean NOT NULL DEFAULT true,
19
+ "created_at" timestamp DEFAULT now() NOT NULL,
20
+ "updated_at" timestamp DEFAULT now() NOT NULL
21
+ );
22
+
23
+ CREATE UNIQUE INDEX IF NOT EXISTS "api_keys_key_hash_unique" ON "api_keys" USING btree ("key_hash");
24
+ CREATE INDEX IF NOT EXISTS "api_keys_user_id_idx" ON "api_keys" USING btree ("user_id");
25
+ CREATE INDEX IF NOT EXISTS "api_keys_role_id_idx" ON "api_keys" USING btree ("role_id");
26
+ CREATE INDEX IF NOT EXISTS "api_keys_is_active_expires_at_idx" ON "api_keys" USING btree ("is_active", "expires_at");
27
+
28
+ -- DOWN
29
+
30
+ DROP INDEX IF EXISTS "api_keys_is_active_expires_at_idx";
31
+ DROP INDEX IF EXISTS "api_keys_role_id_idx";
32
+ DROP INDEX IF EXISTS "api_keys_user_id_idx";
33
+ DROP INDEX IF EXISTS "api_keys_key_hash_unique";
34
+ DROP TABLE IF EXISTS "api_keys";
@@ -0,0 +1,20 @@
1
+ -- Migration: Create site_settings table for general application settings
2
+ -- This migration creates the site_settings singleton table.
3
+ -- Only one row ever exists with id = 'default'.
4
+
5
+ -- UP
6
+
7
+ CREATE TABLE IF NOT EXISTS "site_settings" (
8
+ "id" text PRIMARY KEY NOT NULL,
9
+ "application_name" varchar(255),
10
+ "site_url" varchar(2048),
11
+ "admin_email" varchar(255),
12
+ "timezone" varchar(100),
13
+ "date_format" varchar(50),
14
+ "time_format" varchar(50),
15
+ "updated_at" timestamp DEFAULT now() NOT NULL
16
+ );
17
+
18
+ -- DOWN
19
+
20
+ DROP TABLE IF EXISTS "site_settings";
@@ -0,0 +1,9 @@
1
+ -- Migration: Add logo_url column to site_settings
2
+
3
+ -- UP
4
+
5
+ ALTER TABLE "site_settings" ADD COLUMN IF NOT EXISTS "logo_url" varchar(2048);
6
+
7
+ -- DOWN
8
+
9
+ ALTER TABLE "site_settings" DROP COLUMN IF EXISTS "logo_url";
@@ -0,0 +1,29 @@
1
+ -- Migration: Create activity_log table for Dashboard Activity Feed (Plan 16)
2
+ -- This migration creates the activity_log table that records create/update/delete
3
+ -- actions across all collections for the dashboard activity feed.
4
+
5
+ -- UP
6
+
7
+ CREATE TABLE IF NOT EXISTS "activity_log" (
8
+ "id" text PRIMARY KEY NOT NULL,
9
+ "user_id" text NOT NULL REFERENCES "users"("id") ON DELETE CASCADE,
10
+ "user_name" text NOT NULL,
11
+ "user_email" text NOT NULL,
12
+ "action" varchar(10) NOT NULL,
13
+ "collection" varchar(255) NOT NULL,
14
+ "entry_id" text,
15
+ "entry_title" text,
16
+ "metadata" text,
17
+ "created_at" timestamp DEFAULT now() NOT NULL
18
+ );
19
+
20
+ CREATE INDEX IF NOT EXISTS "idx_activity_log_created_at" ON "activity_log" USING btree ("created_at");
21
+ CREATE INDEX IF NOT EXISTS "idx_activity_log_collection" ON "activity_log" USING btree ("collection", "created_at");
22
+ CREATE INDEX IF NOT EXISTS "idx_activity_log_user_id" ON "activity_log" USING btree ("user_id", "created_at");
23
+
24
+ -- DOWN
25
+
26
+ DROP INDEX IF EXISTS "idx_activity_log_user_id";
27
+ DROP INDEX IF EXISTS "idx_activity_log_collection";
28
+ DROP INDEX IF EXISTS "idx_activity_log_created_at";
29
+ DROP TABLE IF EXISTS "activity_log";