@nexttylabs/echo 0.4.0 → 0.6.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 (262) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/app/(dashboard)/admin/feedback/[id]/edit/page.tsx +12 -6
  3. package/app/(dashboard)/admin/feedback/new/page.tsx +19 -17
  4. package/app/(dashboard)/admin/layout.tsx +16 -6
  5. package/app/(dashboard)/layout.tsx +4 -2
  6. package/app/(dashboard)/settings/api-keys/page.tsx +13 -3
  7. package/app/(dashboard)/settings/layout.tsx +25 -2
  8. package/app/(dashboard)/settings/organization/page.tsx +8 -9
  9. package/app/(public)/[organizationSlug]/roadmap/page.tsx +19 -1
  10. package/app/api/admin/backup/route.ts +22 -4
  11. package/app/api/auth/register/handler.ts +1 -2
  12. package/app/api/feedback/[id]/comments/[commentId]/route.ts +13 -4
  13. package/app/api/feedback/[id]/reclassify/route.ts +4 -4
  14. package/app/api/organizations/handler.ts +2 -4
  15. package/components/settings/settings-sidebar.tsx +4 -4
  16. package/hooks/use-organization.tsx +116 -0
  17. package/hooks/use-permissions.ts +24 -11
  18. package/lib/auth/config.ts +0 -7
  19. package/lib/auth/organization.ts +20 -0
  20. package/lib/auth/permissions.ts +10 -0
  21. package/lib/db/migrations/0000_needy_leech.sql +335 -0
  22. package/lib/db/migrations/meta/0000_snapshot.json +2186 -1
  23. package/lib/db/migrations/meta/_journal.json +2 -135
  24. package/lib/db/schema/auth.ts +0 -1
  25. package/lib/db/schema/index.ts +0 -1
  26. package/lib/portal/public-context.tsx +5 -0
  27. package/package.json +20 -1
  28. package/.changeset/README.md +0 -21
  29. package/.changeset/config.json +0 -11
  30. package/.changeset/cozy-ghosts-care.md +0 -5
  31. package/.changeset/sharp-lines-stand.md +0 -5
  32. package/.changeset/sour-doodles-eat.md +0 -5
  33. package/.changeset/tender-moose-shop.md +0 -5
  34. package/.github/pull_request_template.md +0 -13
  35. package/.github/workflows/ci.yml +0 -41
  36. package/.github/workflows/publish.yml +0 -44
  37. package/.github/workflows/release.yml +0 -73
  38. package/AGENTS.md +0 -92
  39. package/Dockerfile +0 -57
  40. package/Makefile +0 -77
  41. package/bun.lock +0 -2503
  42. package/components/portal/project-switcher.tsx +0 -20
  43. package/docker-compose.dev.yml +0 -26
  44. package/docker-compose.yml +0 -98
  45. package/docs/architecture.md +0 -259
  46. package/docs/component-inventory.md +0 -261
  47. package/docs/database-migrations.md +0 -76
  48. package/docs/development-guide.md +0 -209
  49. package/docs/e2e-user-flows.csv +0 -31
  50. package/docs/er-diagram-feedback.mmd +0 -138
  51. package/docs/er-diagram.mmd +0 -281
  52. package/docs/i18n-check-report.md +0 -296
  53. package/docs/index.md +0 -214
  54. package/docs/logic-chain.md +0 -94
  55. package/docs/plans/2026-01-02-database-migration-scripts.md +0 -496
  56. package/docs/plans/2026-01-02-user-login-design.md +0 -37
  57. package/docs/plans/2026-01-02-user-login.md +0 -437
  58. package/docs/plans/2026-01-02-user-registration-design.md +0 -47
  59. package/docs/plans/2026-01-02-user-registration.md +0 -628
  60. package/docs/plans/2026-01-03-roles-permissions-design.md +0 -20
  61. package/docs/plans/2026-01-03-roles-permissions.md +0 -266
  62. package/docs/plans/2026-01-05-authentication-middleware.md +0 -207
  63. package/docs/plans/2026-01-05-member-removal.md +0 -186
  64. package/docs/plans/2026-01-05-organization-creation.md +0 -374
  65. package/docs/plans/2026-01-05-rbac-middleware.md +0 -112
  66. package/docs/plans/2026-01-05-role-configuration.md +0 -441
  67. package/docs/plans/2026-01-06-file-upload-support.md +0 -804
  68. package/docs/plans/2026-01-06-permission-check-hook.md +0 -155
  69. package/docs/plans/2026-01-06-resource-ownership-check.md +0 -231
  70. package/docs/plans/2026-01-07-feedback-tracking-link.md +0 -459
  71. package/docs/plans/2026-01-09-logout-redirect-design.md +0 -52
  72. package/docs/plans/2026-01-09-phase2-3-plan.md +0 -654
  73. package/docs/plans/2026-01-09-portal-execution-plan.md +0 -408
  74. package/docs/plans/2026-01-09-project-delete-feature-design.md +0 -163
  75. package/docs/plans/2026-01-09-project-delete-implementation.md +0 -451
  76. package/docs/plans/2026-01-09-project-edit-delete-design.md +0 -52
  77. package/docs/plans/2026-01-09-settings-center-design.md +0 -114
  78. package/docs/plans/2026-01-09-settings-center.md +0 -948
  79. package/docs/plans/2026-01-10-organization-only-design.md +0 -66
  80. package/docs/plans/2026-01-10-organization-only-implementation.md +0 -433
  81. package/docs/plans/2026-01-10-portal-settings-restructure-plan.md +0 -18
  82. package/docs/plans/2026-01-10-project-settings-tabs-design-implementation.md +0 -296
  83. package/docs/plans/2026-01-14-e2e-playwright-feedback.md +0 -173
  84. package/docs/plans/2026-01-15-feedback-management-org-context-design.md +0 -82
  85. package/docs/plans/2026-01-15-feedback-management-org-context-implementation-plan.md +0 -521
  86. package/docs/plans/2026-01-16-admin-feedback-filters-design.md +0 -75
  87. package/docs/plans/2026-01-16-admin-feedback-filters-implementation.md +0 -293
  88. package/docs/plans/2026-01-16-admin-feedback-route-consolidation.md +0 -180
  89. package/docs/plans/2026-01-16-e2e-test-fixes.md +0 -158
  90. package/docs/plans/2026-01-17-admin-feedback-filters.md +0 -214
  91. package/docs/plans/2026-01-17-admin-feedback-improvements.md +0 -453
  92. package/docs/plans/2026-01-18-changesets-design.md +0 -40
  93. package/docs/product_changes.md +0 -37
  94. package/docs/project-overview.md +0 -159
  95. package/docs/project-scan-report.json +0 -104
  96. package/docs/route-role-visibility.md +0 -51
  97. package/docs/source-tree-analysis.md +0 -150
  98. package/docs/testing/delete-project-manual-tests.md +0 -18
  99. package/docs/user-story-tracking.md +0 -191
  100. package/eslint.config.mjs +0 -19
  101. package/lib/db/migrations/.gitkeep +0 -0
  102. package/lib/db/migrations/0000_cynical_gladiator.sql +0 -53
  103. package/lib/db/migrations/0001_wandering_sunfire.sql +0 -27
  104. package/lib/db/migrations/0002_shallow_speedball.sql +0 -1
  105. package/lib/db/migrations/0003_add_org_description.sql +0 -1
  106. package/lib/db/migrations/0003_boring_wild_pack.sql +0 -13
  107. package/lib/db/migrations/0004_windy_tyrannus.sql +0 -27
  108. package/lib/db/migrations/0005_perpetual_doorman.sql +0 -5
  109. package/lib/db/migrations/0006_aberrant_captain_midlands.sql +0 -13
  110. package/lib/db/migrations/0007_clever_captain_cross.sql +0 -14
  111. package/lib/db/migrations/0008_sparkling_pandemic.sql +0 -2
  112. package/lib/db/migrations/0009_happy_black_tom.sql +0 -29
  113. package/lib/db/migrations/0010_kind_junta.sql +0 -8
  114. package/lib/db/migrations/0011_mute_squadron_supreme.sql +0 -25
  115. package/lib/db/migrations/0012_giant_power_man.sql +0 -24
  116. package/lib/db/migrations/0013_damp_titanium_man.sql +0 -17
  117. package/lib/db/migrations/0014_blue_alice.sql +0 -18
  118. package/lib/db/migrations/0015_webhook_tables.sql +0 -41
  119. package/lib/db/migrations/0016_github_integration.sql +0 -30
  120. package/lib/db/migrations/0016_overjoyed_ghost_rider.sql +0 -22
  121. package/lib/db/migrations/0017_slimy_inhumans.sql +0 -6
  122. package/lib/db/migrations/0018_same_spitfire.sql +0 -1
  123. package/lib/db/migrations/0019_jittery_loners.sql +0 -16
  124. package/lib/db/migrations/0019_remove_projects_add_org_settings.sql +0 -14
  125. package/lib/db/migrations/meta/0001_snapshot.json +0 -553
  126. package/lib/db/migrations/meta/0002_snapshot.json +0 -560
  127. package/lib/db/migrations/meta/0003_snapshot.json +0 -650
  128. package/lib/db/migrations/meta/0004_snapshot.json +0 -852
  129. package/lib/db/migrations/meta/0005_snapshot.json +0 -900
  130. package/lib/db/migrations/meta/0006_snapshot.json +0 -1011
  131. package/lib/db/migrations/meta/0007_snapshot.json +0 -1125
  132. package/lib/db/migrations/meta/0008_snapshot.json +0 -1146
  133. package/lib/db/migrations/meta/0009_snapshot.json +0 -1386
  134. package/lib/db/migrations/meta/0010_snapshot.json +0 -1419
  135. package/lib/db/migrations/meta/0011_snapshot.json +0 -1615
  136. package/lib/db/migrations/meta/0012_snapshot.json +0 -1805
  137. package/lib/db/migrations/meta/0013_snapshot.json +0 -1948
  138. package/lib/db/migrations/meta/0014_snapshot.json +0 -2082
  139. package/lib/db/migrations/meta/0015_snapshot.json +0 -2476
  140. package/lib/db/migrations/meta/0016_snapshot.json +0 -2633
  141. package/lib/db/migrations/meta/0017_snapshot.json +0 -2680
  142. package/lib/db/migrations/meta/0018_snapshot.json +0 -2686
  143. package/lib/db/migrations/meta/0019_snapshot.json +0 -2741
  144. package/lib/db/schema/projects.ts +0 -145
  145. package/lib/db/schema/user-profiles.ts +0 -31
  146. package/lib/validations/projects.ts +0 -49
  147. package/next-env.d.ts +0 -6
  148. package/playwright.config.ts +0 -44
  149. package/proxy.test.ts +0 -131
  150. package/proxy.ts +0 -116
  151. package/scripts/backup-db.sh +0 -57
  152. package/scripts/backup-db.ts +0 -24
  153. package/scripts/generate-openapi.ts +0 -22
  154. package/scripts/migration-helper.ts +0 -39
  155. package/scripts/pre-deploy.ts +0 -75
  156. package/scripts/restore-db.sh +0 -60
  157. package/scripts/rollback.ts +0 -72
  158. package/scripts/seed-tags.ts +0 -48
  159. package/tests/api/feedback-bulk.test.ts +0 -47
  160. package/tests/api/feedback-by-id.test.ts +0 -67
  161. package/tests/api/feedback-comments-route-import.test.ts +0 -26
  162. package/tests/api/feedback-create.test.ts +0 -71
  163. package/tests/api/feedback-delete.test.ts +0 -160
  164. package/tests/api/feedback-filter.test.ts +0 -250
  165. package/tests/api/feedback-list.test.ts +0 -234
  166. package/tests/api/feedback-route-assignee-condition.test.ts +0 -32
  167. package/tests/api/feedback-similar.test.ts +0 -46
  168. package/tests/api/feedback-sort.test.ts +0 -261
  169. package/tests/api/feedback-status-enum.test.ts +0 -49
  170. package/tests/api/feedback-status-filter.test.ts +0 -117
  171. package/tests/api/feedback-submit-on-behalf.test.ts +0 -269
  172. package/tests/api/feedback.test.ts +0 -175
  173. package/tests/api/identify-jwt.test.ts +0 -25
  174. package/tests/api/invitation-accept.test.ts +0 -213
  175. package/tests/api/organization-invitations.test.ts +0 -186
  176. package/tests/api/organization-members-list.test.ts +0 -79
  177. package/tests/api/organization-members.test.ts +0 -340
  178. package/tests/api/organizations.test.ts +0 -149
  179. package/tests/api/register.test.ts +0 -112
  180. package/tests/api/upload.test.ts +0 -103
  181. package/tests/api/vote.test.ts +0 -82
  182. package/tests/app/admin-feedback-detail-page.test.tsx +0 -25
  183. package/tests/app/admin-feedback-list-page.test.tsx +0 -25
  184. package/tests/app/admin-feedback-new-page.test.tsx +0 -25
  185. package/tests/app/health-route-helpers.test.ts +0 -27
  186. package/tests/app/login-page.test.ts +0 -26
  187. package/tests/app/portal-page.test.ts +0 -29
  188. package/tests/app/project-portal-overview.test.tsx +0 -25
  189. package/tests/app/widget-page-import.test.ts +0 -25
  190. package/tests/components/create-post-dialog-defaults.test.ts +0 -43
  191. package/tests/components/feedback/duplicate-suggestions-inline.test.tsx +0 -27
  192. package/tests/components/feedback/embedded-feedback-form.test.tsx +0 -96
  193. package/tests/components/feedback/feedback-detail.test.tsx +0 -25
  194. package/tests/components/feedback/feedback-stats.test.tsx +0 -49
  195. package/tests/components/feedback-bulk-actions.test.tsx +0 -39
  196. package/tests/components/feedback-i18n-keys.test.ts +0 -70
  197. package/tests/components/feedback-list-controls-compile.test.ts +0 -25
  198. package/tests/components/feedback-list-controls.test.tsx +0 -204
  199. package/tests/components/feedback-list-item.test.tsx +0 -67
  200. package/tests/components/landing/hero.test.tsx +0 -46
  201. package/tests/components/layout/language-switcher.test.tsx +0 -25
  202. package/tests/components/layout/sidebar.test.tsx +0 -157
  203. package/tests/components/login-form.test.ts +0 -25
  204. package/tests/components/organization-form.test.ts +0 -32
  205. package/tests/components/organization-switcher.test.ts +0 -25
  206. package/tests/components/pagination.test.tsx +0 -43
  207. package/tests/components/portal-overview.test.tsx +0 -25
  208. package/tests/components/profile-form.test.tsx +0 -139
  209. package/tests/components/role-selector.test.ts +0 -31
  210. package/tests/components/status-chart.test.tsx +0 -90
  211. package/tests/e2e/auth.e2e.ts +0 -323
  212. package/tests/e2e/feedback-actions.e2e.ts +0 -471
  213. package/tests/e2e/feedback-attachment.e2e.ts +0 -168
  214. package/tests/e2e/feedback-customer.e2e.ts +0 -226
  215. package/tests/e2e/feedback-management.e2e.ts +0 -565
  216. package/tests/e2e/feedback-submit.e2e.ts +0 -133
  217. package/tests/e2e/feedback-view.e2e.ts +0 -297
  218. package/tests/e2e/fixtures/test-data.ts +0 -235
  219. package/tests/e2e/health-check.e2e.ts +0 -230
  220. package/tests/e2e/helpers/test-utils-helpers.test.ts +0 -43
  221. package/tests/e2e/helpers/test-utils.ts +0 -298
  222. package/tests/e2e/integration-placeholders.e2e.ts +0 -199
  223. package/tests/e2e/organization.e2e.ts +0 -292
  224. package/tests/e2e/permissions.e2e.ts +0 -424
  225. package/tests/e2e/project-widget.e2e.ts +0 -63
  226. package/tests/feedback/filters.test.ts +0 -29
  227. package/tests/hooks/use-permissions.test.ts +0 -52
  228. package/tests/lib/ai/classifier.test.ts +0 -104
  229. package/tests/lib/ai/duplicate-detector.test.ts +0 -234
  230. package/tests/lib/attachments-schema.test.ts +0 -30
  231. package/tests/lib/auth/session.test.ts +0 -49
  232. package/tests/lib/auth-client.test.ts +0 -37
  233. package/tests/lib/auth-config.test.ts +0 -26
  234. package/tests/lib/feedback-prefill.test.ts +0 -52
  235. package/tests/lib/feedback-processor.test.ts +0 -41
  236. package/tests/lib/feedback-schema.test.ts +0 -33
  237. package/tests/lib/file-validator.test.ts +0 -48
  238. package/tests/lib/get-feedback-by-id.test.ts +0 -37
  239. package/tests/lib/invitations.test.ts +0 -35
  240. package/tests/lib/login-schema.test.ts +0 -36
  241. package/tests/lib/org-context.test.ts +0 -95
  242. package/tests/lib/organization-access.test.ts +0 -44
  243. package/tests/lib/organization-member-role-schema.test.ts +0 -41
  244. package/tests/lib/permissions.test.ts +0 -88
  245. package/tests/lib/portal-analytics.test.ts +0 -25
  246. package/tests/lib/portal-contributors.test.ts +0 -25
  247. package/tests/lib/portal-copy.test.ts +0 -27
  248. package/tests/lib/portal-i18n.test.ts +0 -30
  249. package/tests/lib/portal-leaderboard-settings.test.ts +0 -25
  250. package/tests/lib/portal-modules.test.ts +0 -25
  251. package/tests/lib/portal-seo.test.ts +0 -25
  252. package/tests/lib/portal-sharing.test.ts +0 -25
  253. package/tests/lib/portal-sorting.test.ts +0 -25
  254. package/tests/lib/portal-theme.test.ts +0 -25
  255. package/tests/lib/rate-limit.test.ts +0 -142
  256. package/tests/lib/resolve-locale.test.ts +0 -34
  257. package/tests/lib/services/backup.test.ts +0 -145
  258. package/tests/lib/user-organizations.test.ts +0 -42
  259. package/tests/lib/user-role-schema.test.ts +0 -33
  260. package/tests/lib/user-schema.test.ts +0 -25
  261. package/tests/setup.ts +0 -74
  262. package/vercel.json +0 -4
@@ -1,16 +0,0 @@
1
- CREATE TABLE "organization_settings" (
2
- "organizationId" text PRIMARY KEY NOT NULL,
3
- "widgetConfig" jsonb,
4
- "portalConfig" jsonb,
5
- "customDomain" text,
6
- "createdAt" timestamp DEFAULT now() NOT NULL,
7
- "updatedAt" timestamp DEFAULT now() NOT NULL,
8
- CONSTRAINT "unique_org_custom_domain" UNIQUE("customDomain")
9
- );
10
- --> statement-breakpoint
11
- ALTER TABLE "feedback" DROP CONSTRAINT "feedback_projectId_projects_projectId_fk";
12
- --> statement-breakpoint
13
- DROP INDEX "idx_feedback_projectId";--> statement-breakpoint
14
- ALTER TABLE "organization_settings" ADD CONSTRAINT "organization_settings_organizationId_organizations_id_fk" FOREIGN KEY ("organizationId") REFERENCES "public"."organizations"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
15
- CREATE INDEX "idx_org_settings_orgId" ON "organization_settings" USING btree ("organizationId");--> statement-breakpoint
16
- ALTER TABLE "feedback" DROP COLUMN "projectId";
@@ -1,14 +0,0 @@
1
- DROP TABLE IF EXISTS "projects" CASCADE;
2
- ALTER TABLE "feedback" DROP COLUMN IF EXISTS "projectId";
3
- DROP INDEX IF EXISTS "idx_feedback_projectId";
4
-
5
- CREATE TABLE "organization_settings" (
6
- "organizationId" text PRIMARY KEY REFERENCES "organizations"("id") ON DELETE cascade,
7
- "widgetConfig" jsonb,
8
- "portalConfig" jsonb,
9
- "customDomain" text,
10
- "createdAt" timestamp DEFAULT now() NOT NULL,
11
- "updatedAt" timestamp DEFAULT now() NOT NULL
12
- );
13
- CREATE INDEX "idx_org_settings_orgId" ON "organization_settings" ("organizationId");
14
- ALTER TABLE "organization_settings" ADD CONSTRAINT "unique_org_custom_domain" UNIQUE ("customDomain");
@@ -1,553 +0,0 @@
1
- {
2
- "id": "06611ee0-ebfc-4d8a-850b-c5dd18e693a7",
3
- "prevId": "44c1638e-ba7c-460b-a6ac-342601d382b3",
4
- "version": "7",
5
- "dialect": "postgresql",
6
- "tables": {
7
- "public.account": {
8
- "name": "account",
9
- "schema": "",
10
- "columns": {
11
- "id": {
12
- "name": "id",
13
- "type": "text",
14
- "primaryKey": true,
15
- "notNull": true
16
- },
17
- "account_id": {
18
- "name": "account_id",
19
- "type": "text",
20
- "primaryKey": false,
21
- "notNull": true
22
- },
23
- "provider_id": {
24
- "name": "provider_id",
25
- "type": "text",
26
- "primaryKey": false,
27
- "notNull": true
28
- },
29
- "user_id": {
30
- "name": "user_id",
31
- "type": "text",
32
- "primaryKey": false,
33
- "notNull": true
34
- },
35
- "access_token": {
36
- "name": "access_token",
37
- "type": "text",
38
- "primaryKey": false,
39
- "notNull": false
40
- },
41
- "refresh_token": {
42
- "name": "refresh_token",
43
- "type": "text",
44
- "primaryKey": false,
45
- "notNull": false
46
- },
47
- "id_token": {
48
- "name": "id_token",
49
- "type": "text",
50
- "primaryKey": false,
51
- "notNull": false
52
- },
53
- "access_token_expires_at": {
54
- "name": "access_token_expires_at",
55
- "type": "timestamp",
56
- "primaryKey": false,
57
- "notNull": false
58
- },
59
- "refresh_token_expires_at": {
60
- "name": "refresh_token_expires_at",
61
- "type": "timestamp",
62
- "primaryKey": false,
63
- "notNull": false
64
- },
65
- "scope": {
66
- "name": "scope",
67
- "type": "text",
68
- "primaryKey": false,
69
- "notNull": false
70
- },
71
- "password": {
72
- "name": "password",
73
- "type": "text",
74
- "primaryKey": false,
75
- "notNull": false
76
- },
77
- "created_at": {
78
- "name": "created_at",
79
- "type": "timestamp",
80
- "primaryKey": false,
81
- "notNull": true,
82
- "default": "now()"
83
- },
84
- "updated_at": {
85
- "name": "updated_at",
86
- "type": "timestamp",
87
- "primaryKey": false,
88
- "notNull": true
89
- }
90
- },
91
- "indexes": {
92
- "account_userId_idx": {
93
- "name": "account_userId_idx",
94
- "columns": [
95
- {
96
- "expression": "user_id",
97
- "isExpression": false,
98
- "asc": true,
99
- "nulls": "last"
100
- }
101
- ],
102
- "isUnique": false,
103
- "concurrently": false,
104
- "method": "btree",
105
- "with": {}
106
- }
107
- },
108
- "foreignKeys": {
109
- "account_user_id_user_id_fk": {
110
- "name": "account_user_id_user_id_fk",
111
- "tableFrom": "account",
112
- "tableTo": "user",
113
- "columnsFrom": [
114
- "user_id"
115
- ],
116
- "columnsTo": [
117
- "id"
118
- ],
119
- "onDelete": "cascade",
120
- "onUpdate": "no action"
121
- }
122
- },
123
- "compositePrimaryKeys": {},
124
- "uniqueConstraints": {},
125
- "policies": {},
126
- "checkConstraints": {},
127
- "isRLSEnabled": false
128
- },
129
- "public.session": {
130
- "name": "session",
131
- "schema": "",
132
- "columns": {
133
- "id": {
134
- "name": "id",
135
- "type": "text",
136
- "primaryKey": true,
137
- "notNull": true
138
- },
139
- "expires_at": {
140
- "name": "expires_at",
141
- "type": "timestamp",
142
- "primaryKey": false,
143
- "notNull": true
144
- },
145
- "token": {
146
- "name": "token",
147
- "type": "text",
148
- "primaryKey": false,
149
- "notNull": true
150
- },
151
- "created_at": {
152
- "name": "created_at",
153
- "type": "timestamp",
154
- "primaryKey": false,
155
- "notNull": true,
156
- "default": "now()"
157
- },
158
- "updated_at": {
159
- "name": "updated_at",
160
- "type": "timestamp",
161
- "primaryKey": false,
162
- "notNull": true
163
- },
164
- "ip_address": {
165
- "name": "ip_address",
166
- "type": "text",
167
- "primaryKey": false,
168
- "notNull": false
169
- },
170
- "user_agent": {
171
- "name": "user_agent",
172
- "type": "text",
173
- "primaryKey": false,
174
- "notNull": false
175
- },
176
- "user_id": {
177
- "name": "user_id",
178
- "type": "text",
179
- "primaryKey": false,
180
- "notNull": true
181
- }
182
- },
183
- "indexes": {
184
- "session_userId_idx": {
185
- "name": "session_userId_idx",
186
- "columns": [
187
- {
188
- "expression": "user_id",
189
- "isExpression": false,
190
- "asc": true,
191
- "nulls": "last"
192
- }
193
- ],
194
- "isUnique": false,
195
- "concurrently": false,
196
- "method": "btree",
197
- "with": {}
198
- }
199
- },
200
- "foreignKeys": {
201
- "session_user_id_user_id_fk": {
202
- "name": "session_user_id_user_id_fk",
203
- "tableFrom": "session",
204
- "tableTo": "user",
205
- "columnsFrom": [
206
- "user_id"
207
- ],
208
- "columnsTo": [
209
- "id"
210
- ],
211
- "onDelete": "cascade",
212
- "onUpdate": "no action"
213
- }
214
- },
215
- "compositePrimaryKeys": {},
216
- "uniqueConstraints": {
217
- "session_token_unique": {
218
- "name": "session_token_unique",
219
- "nullsNotDistinct": false,
220
- "columns": [
221
- "token"
222
- ]
223
- }
224
- },
225
- "policies": {},
226
- "checkConstraints": {},
227
- "isRLSEnabled": false
228
- },
229
- "public.user": {
230
- "name": "user",
231
- "schema": "",
232
- "columns": {
233
- "id": {
234
- "name": "id",
235
- "type": "text",
236
- "primaryKey": true,
237
- "notNull": true
238
- },
239
- "name": {
240
- "name": "name",
241
- "type": "text",
242
- "primaryKey": false,
243
- "notNull": true
244
- },
245
- "email": {
246
- "name": "email",
247
- "type": "text",
248
- "primaryKey": false,
249
- "notNull": true
250
- },
251
- "email_verified": {
252
- "name": "email_verified",
253
- "type": "boolean",
254
- "primaryKey": false,
255
- "notNull": true,
256
- "default": false
257
- },
258
- "image": {
259
- "name": "image",
260
- "type": "text",
261
- "primaryKey": false,
262
- "notNull": false
263
- },
264
- "created_at": {
265
- "name": "created_at",
266
- "type": "timestamp",
267
- "primaryKey": false,
268
- "notNull": true,
269
- "default": "now()"
270
- },
271
- "updated_at": {
272
- "name": "updated_at",
273
- "type": "timestamp",
274
- "primaryKey": false,
275
- "notNull": true,
276
- "default": "now()"
277
- }
278
- },
279
- "indexes": {},
280
- "foreignKeys": {},
281
- "compositePrimaryKeys": {},
282
- "uniqueConstraints": {
283
- "user_email_unique": {
284
- "name": "user_email_unique",
285
- "nullsNotDistinct": false,
286
- "columns": [
287
- "email"
288
- ]
289
- }
290
- },
291
- "policies": {},
292
- "checkConstraints": {},
293
- "isRLSEnabled": false
294
- },
295
- "public.verification": {
296
- "name": "verification",
297
- "schema": "",
298
- "columns": {
299
- "id": {
300
- "name": "id",
301
- "type": "text",
302
- "primaryKey": true,
303
- "notNull": true
304
- },
305
- "identifier": {
306
- "name": "identifier",
307
- "type": "text",
308
- "primaryKey": false,
309
- "notNull": true
310
- },
311
- "value": {
312
- "name": "value",
313
- "type": "text",
314
- "primaryKey": false,
315
- "notNull": true
316
- },
317
- "expires_at": {
318
- "name": "expires_at",
319
- "type": "timestamp",
320
- "primaryKey": false,
321
- "notNull": true
322
- },
323
- "created_at": {
324
- "name": "created_at",
325
- "type": "timestamp",
326
- "primaryKey": false,
327
- "notNull": true,
328
- "default": "now()"
329
- },
330
- "updated_at": {
331
- "name": "updated_at",
332
- "type": "timestamp",
333
- "primaryKey": false,
334
- "notNull": true,
335
- "default": "now()"
336
- }
337
- },
338
- "indexes": {
339
- "verification_identifier_idx": {
340
- "name": "verification_identifier_idx",
341
- "columns": [
342
- {
343
- "expression": "identifier",
344
- "isExpression": false,
345
- "asc": true,
346
- "nulls": "last"
347
- }
348
- ],
349
- "isUnique": false,
350
- "concurrently": false,
351
- "method": "btree",
352
- "with": {}
353
- }
354
- },
355
- "foreignKeys": {},
356
- "compositePrimaryKeys": {},
357
- "uniqueConstraints": {},
358
- "policies": {},
359
- "checkConstraints": {},
360
- "isRLSEnabled": false
361
- },
362
- "public.user_profiles": {
363
- "name": "user_profiles",
364
- "schema": "",
365
- "columns": {
366
- "user_id": {
367
- "name": "user_id",
368
- "type": "text",
369
- "primaryKey": true,
370
- "notNull": true
371
- },
372
- "name": {
373
- "name": "name",
374
- "type": "text",
375
- "primaryKey": false,
376
- "notNull": true
377
- },
378
- "created_at": {
379
- "name": "created_at",
380
- "type": "timestamp",
381
- "primaryKey": false,
382
- "notNull": true,
383
- "default": "now()"
384
- },
385
- "updated_at": {
386
- "name": "updated_at",
387
- "type": "timestamp",
388
- "primaryKey": false,
389
- "notNull": true,
390
- "default": "now()"
391
- }
392
- },
393
- "indexes": {},
394
- "foreignKeys": {
395
- "user_profiles_user_id_user_id_fk": {
396
- "name": "user_profiles_user_id_user_id_fk",
397
- "tableFrom": "user_profiles",
398
- "tableTo": "user",
399
- "columnsFrom": [
400
- "user_id"
401
- ],
402
- "columnsTo": [
403
- "id"
404
- ],
405
- "onDelete": "cascade",
406
- "onUpdate": "no action"
407
- }
408
- },
409
- "compositePrimaryKeys": {},
410
- "uniqueConstraints": {},
411
- "policies": {},
412
- "checkConstraints": {},
413
- "isRLSEnabled": false
414
- },
415
- "public.organizations": {
416
- "name": "organizations",
417
- "schema": "",
418
- "columns": {
419
- "id": {
420
- "name": "id",
421
- "type": "text",
422
- "primaryKey": true,
423
- "notNull": true
424
- },
425
- "name": {
426
- "name": "name",
427
- "type": "text",
428
- "primaryKey": false,
429
- "notNull": true
430
- },
431
- "slug": {
432
- "name": "slug",
433
- "type": "text",
434
- "primaryKey": false,
435
- "notNull": true
436
- },
437
- "created_at": {
438
- "name": "created_at",
439
- "type": "timestamp",
440
- "primaryKey": false,
441
- "notNull": true,
442
- "default": "now()"
443
- },
444
- "updated_at": {
445
- "name": "updated_at",
446
- "type": "timestamp",
447
- "primaryKey": false,
448
- "notNull": true,
449
- "default": "now()"
450
- }
451
- },
452
- "indexes": {},
453
- "foreignKeys": {},
454
- "compositePrimaryKeys": {},
455
- "uniqueConstraints": {
456
- "organizations_slug_unique": {
457
- "name": "organizations_slug_unique",
458
- "nullsNotDistinct": false,
459
- "columns": [
460
- "slug"
461
- ]
462
- }
463
- },
464
- "policies": {},
465
- "checkConstraints": {},
466
- "isRLSEnabled": false
467
- },
468
- "public.organization_members": {
469
- "name": "organization_members",
470
- "schema": "",
471
- "columns": {
472
- "organization_id": {
473
- "name": "organization_id",
474
- "type": "text",
475
- "primaryKey": false,
476
- "notNull": true
477
- },
478
- "user_id": {
479
- "name": "user_id",
480
- "type": "text",
481
- "primaryKey": false,
482
- "notNull": true
483
- },
484
- "role": {
485
- "name": "role",
486
- "type": "text",
487
- "primaryKey": false,
488
- "notNull": true
489
- },
490
- "created_at": {
491
- "name": "created_at",
492
- "type": "timestamp",
493
- "primaryKey": false,
494
- "notNull": true,
495
- "default": "now()"
496
- }
497
- },
498
- "indexes": {},
499
- "foreignKeys": {
500
- "organization_members_organization_id_organizations_id_fk": {
501
- "name": "organization_members_organization_id_organizations_id_fk",
502
- "tableFrom": "organization_members",
503
- "tableTo": "organizations",
504
- "columnsFrom": [
505
- "organization_id"
506
- ],
507
- "columnsTo": [
508
- "id"
509
- ],
510
- "onDelete": "cascade",
511
- "onUpdate": "no action"
512
- },
513
- "organization_members_user_id_user_id_fk": {
514
- "name": "organization_members_user_id_user_id_fk",
515
- "tableFrom": "organization_members",
516
- "tableTo": "user",
517
- "columnsFrom": [
518
- "user_id"
519
- ],
520
- "columnsTo": [
521
- "id"
522
- ],
523
- "onDelete": "cascade",
524
- "onUpdate": "no action"
525
- }
526
- },
527
- "compositePrimaryKeys": {
528
- "organization_members_organization_id_user_id_pk": {
529
- "name": "organization_members_organization_id_user_id_pk",
530
- "columns": [
531
- "organization_id",
532
- "user_id"
533
- ]
534
- }
535
- },
536
- "uniqueConstraints": {},
537
- "policies": {},
538
- "checkConstraints": {},
539
- "isRLSEnabled": false
540
- }
541
- },
542
- "enums": {},
543
- "schemas": {},
544
- "sequences": {},
545
- "roles": {},
546
- "policies": {},
547
- "views": {},
548
- "_meta": {
549
- "columns": {},
550
- "schemas": {},
551
- "tables": {}
552
- }
553
- }