create-blitzpack 0.1.0 → 0.1.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 (259) hide show
  1. package/dist/index.js +92 -94
  2. package/package.json +5 -6
  3. package/template/.dockerignore +0 -59
  4. package/template/.github/workflows/ci.yml +0 -157
  5. package/template/.husky/pre-commit +0 -1
  6. package/template/.husky/pre-push +0 -1
  7. package/template/.lintstagedrc.cjs +0 -4
  8. package/template/.nvmrc +0 -1
  9. package/template/.prettierrc +0 -9
  10. package/template/.vscode/settings.json +0 -13
  11. package/template/CLAUDE.md +0 -175
  12. package/template/CONTRIBUTING.md +0 -32
  13. package/template/Dockerfile +0 -90
  14. package/template/GETTING_STARTED.md +0 -35
  15. package/template/LICENSE +0 -21
  16. package/template/README.md +0 -116
  17. package/template/apps/api/.dockerignore +0 -51
  18. package/template/apps/api/.env.local.example +0 -62
  19. package/template/apps/api/emails/account-deleted-email.tsx +0 -69
  20. package/template/apps/api/emails/components/email-layout.tsx +0 -154
  21. package/template/apps/api/emails/config.ts +0 -22
  22. package/template/apps/api/emails/password-changed-email.tsx +0 -88
  23. package/template/apps/api/emails/password-reset-email.tsx +0 -86
  24. package/template/apps/api/emails/verification-email.tsx +0 -85
  25. package/template/apps/api/emails/welcome-email.tsx +0 -70
  26. package/template/apps/api/package.json +0 -84
  27. package/template/apps/api/prisma/migrations/20251012111439_init/migration.sql +0 -13
  28. package/template/apps/api/prisma/migrations/20251018162629_add_better_auth_fields/migration.sql +0 -67
  29. package/template/apps/api/prisma/migrations/20251019142208_add_user_role_enum/migration.sql +0 -5
  30. package/template/apps/api/prisma/migrations/20251019182151_user_auth/migration.sql +0 -7
  31. package/template/apps/api/prisma/migrations/20251019211416_faster_session_lookup/migration.sql +0 -2
  32. package/template/apps/api/prisma/migrations/20251119124337_add_upload_model/migration.sql +0 -26
  33. package/template/apps/api/prisma/migrations/20251120071241_add_scope_to_account/migration.sql +0 -2
  34. package/template/apps/api/prisma/migrations/20251120072608_add_oauth_token_expiration_fields/migration.sql +0 -10
  35. package/template/apps/api/prisma/migrations/20251120144705_add_audit_logs/migration.sql +0 -29
  36. package/template/apps/api/prisma/migrations/20251127123614_remove_impersonated_by/migration.sql +0 -8
  37. package/template/apps/api/prisma/migrations/20251127125630_remove_audit_logs/migration.sql +0 -11
  38. package/template/apps/api/prisma/migrations/migration_lock.toml +0 -3
  39. package/template/apps/api/prisma/schema.prisma +0 -116
  40. package/template/apps/api/prisma/seed.ts +0 -159
  41. package/template/apps/api/prisma.config.ts +0 -14
  42. package/template/apps/api/src/app.ts +0 -377
  43. package/template/apps/api/src/common/logger.service.ts +0 -227
  44. package/template/apps/api/src/config/env.ts +0 -60
  45. package/template/apps/api/src/config/rate-limit.ts +0 -29
  46. package/template/apps/api/src/hooks/auth.ts +0 -122
  47. package/template/apps/api/src/plugins/auth.ts +0 -198
  48. package/template/apps/api/src/plugins/database.ts +0 -45
  49. package/template/apps/api/src/plugins/logger.ts +0 -33
  50. package/template/apps/api/src/plugins/multipart.ts +0 -16
  51. package/template/apps/api/src/plugins/scalar.ts +0 -20
  52. package/template/apps/api/src/plugins/schedule.ts +0 -52
  53. package/template/apps/api/src/plugins/services.ts +0 -66
  54. package/template/apps/api/src/plugins/swagger.ts +0 -56
  55. package/template/apps/api/src/routes/accounts.ts +0 -91
  56. package/template/apps/api/src/routes/admin-sessions.ts +0 -92
  57. package/template/apps/api/src/routes/metrics.ts +0 -71
  58. package/template/apps/api/src/routes/password.ts +0 -46
  59. package/template/apps/api/src/routes/sessions.ts +0 -53
  60. package/template/apps/api/src/routes/stats.ts +0 -38
  61. package/template/apps/api/src/routes/uploads-serve.ts +0 -27
  62. package/template/apps/api/src/routes/uploads.ts +0 -154
  63. package/template/apps/api/src/routes/users.ts +0 -114
  64. package/template/apps/api/src/routes/verification.ts +0 -90
  65. package/template/apps/api/src/server.ts +0 -34
  66. package/template/apps/api/src/services/accounts.service.ts +0 -125
  67. package/template/apps/api/src/services/authorization.service.ts +0 -162
  68. package/template/apps/api/src/services/email.service.ts +0 -170
  69. package/template/apps/api/src/services/file-storage.service.ts +0 -267
  70. package/template/apps/api/src/services/metrics.service.ts +0 -175
  71. package/template/apps/api/src/services/password.service.ts +0 -56
  72. package/template/apps/api/src/services/sessions.service.spec.ts +0 -134
  73. package/template/apps/api/src/services/sessions.service.ts +0 -276
  74. package/template/apps/api/src/services/stats.service.ts +0 -273
  75. package/template/apps/api/src/services/uploads.service.ts +0 -163
  76. package/template/apps/api/src/services/users.service.spec.ts +0 -249
  77. package/template/apps/api/src/services/users.service.ts +0 -198
  78. package/template/apps/api/src/utils/file-validation.ts +0 -108
  79. package/template/apps/api/start.sh +0 -33
  80. package/template/apps/api/test/helpers/fastify-app.ts +0 -24
  81. package/template/apps/api/test/helpers/mock-authorization.ts +0 -16
  82. package/template/apps/api/test/helpers/mock-logger.ts +0 -28
  83. package/template/apps/api/test/helpers/mock-prisma.ts +0 -30
  84. package/template/apps/api/test/helpers/test-db.ts +0 -125
  85. package/template/apps/api/test/integration/auth-flow.integration.spec.ts +0 -449
  86. package/template/apps/api/test/integration/password.integration.spec.ts +0 -427
  87. package/template/apps/api/test/integration/rate-limit.integration.spec.ts +0 -51
  88. package/template/apps/api/test/integration/sessions.integration.spec.ts +0 -445
  89. package/template/apps/api/test/integration/users.integration.spec.ts +0 -211
  90. package/template/apps/api/test/setup.ts +0 -31
  91. package/template/apps/api/tsconfig.json +0 -26
  92. package/template/apps/api/vitest.config.ts +0 -35
  93. package/template/apps/web/.env.local.example +0 -11
  94. package/template/apps/web/components.json +0 -24
  95. package/template/apps/web/next.config.ts +0 -22
  96. package/template/apps/web/package.json +0 -56
  97. package/template/apps/web/postcss.config.js +0 -5
  98. package/template/apps/web/public/apple-icon.png +0 -0
  99. package/template/apps/web/public/icon.png +0 -0
  100. package/template/apps/web/public/robots.txt +0 -3
  101. package/template/apps/web/src/app/(admin)/admin/layout.tsx +0 -222
  102. package/template/apps/web/src/app/(admin)/admin/page.tsx +0 -157
  103. package/template/apps/web/src/app/(admin)/admin/sessions/page.tsx +0 -18
  104. package/template/apps/web/src/app/(admin)/admin/users/page.tsx +0 -20
  105. package/template/apps/web/src/app/(auth)/forgot-password/page.tsx +0 -177
  106. package/template/apps/web/src/app/(auth)/login/page.tsx +0 -159
  107. package/template/apps/web/src/app/(auth)/reset-password/page.tsx +0 -245
  108. package/template/apps/web/src/app/(auth)/signup/page.tsx +0 -153
  109. package/template/apps/web/src/app/dashboard/change-password/page.tsx +0 -255
  110. package/template/apps/web/src/app/dashboard/page.tsx +0 -296
  111. package/template/apps/web/src/app/error.tsx +0 -32
  112. package/template/apps/web/src/app/examples/file-upload/page.tsx +0 -200
  113. package/template/apps/web/src/app/favicon.ico +0 -0
  114. package/template/apps/web/src/app/global-error.tsx +0 -96
  115. package/template/apps/web/src/app/globals.css +0 -22
  116. package/template/apps/web/src/app/icon.png +0 -0
  117. package/template/apps/web/src/app/layout.tsx +0 -34
  118. package/template/apps/web/src/app/not-found.tsx +0 -28
  119. package/template/apps/web/src/app/page.tsx +0 -192
  120. package/template/apps/web/src/components/admin/activity-feed.tsx +0 -101
  121. package/template/apps/web/src/components/admin/charts/auth-breakdown-chart.tsx +0 -114
  122. package/template/apps/web/src/components/admin/charts/chart-tooltip.tsx +0 -124
  123. package/template/apps/web/src/components/admin/charts/realtime-metrics-chart.tsx +0 -511
  124. package/template/apps/web/src/components/admin/charts/role-distribution-chart.tsx +0 -102
  125. package/template/apps/web/src/components/admin/charts/session-activity-chart.tsx +0 -90
  126. package/template/apps/web/src/components/admin/charts/user-growth-chart.tsx +0 -108
  127. package/template/apps/web/src/components/admin/health-indicator.tsx +0 -175
  128. package/template/apps/web/src/components/admin/refresh-control.tsx +0 -90
  129. package/template/apps/web/src/components/admin/session-revoke-all-dialog.tsx +0 -79
  130. package/template/apps/web/src/components/admin/session-revoke-dialog.tsx +0 -74
  131. package/template/apps/web/src/components/admin/sessions-management-table.tsx +0 -372
  132. package/template/apps/web/src/components/admin/stat-card.tsx +0 -137
  133. package/template/apps/web/src/components/admin/user-create-dialog.tsx +0 -152
  134. package/template/apps/web/src/components/admin/user-delete-dialog.tsx +0 -73
  135. package/template/apps/web/src/components/admin/user-edit-dialog.tsx +0 -170
  136. package/template/apps/web/src/components/admin/users-management-table.tsx +0 -285
  137. package/template/apps/web/src/components/auth/email-verification-banner.tsx +0 -85
  138. package/template/apps/web/src/components/auth/github-button.tsx +0 -40
  139. package/template/apps/web/src/components/auth/google-button.tsx +0 -54
  140. package/template/apps/web/src/components/auth/protected-route.tsx +0 -66
  141. package/template/apps/web/src/components/auth/redirect-if-authenticated.tsx +0 -31
  142. package/template/apps/web/src/components/auth/with-auth.tsx +0 -30
  143. package/template/apps/web/src/components/error/error-card.tsx +0 -47
  144. package/template/apps/web/src/components/error/forbidden.tsx +0 -25
  145. package/template/apps/web/src/components/landing/command-block.tsx +0 -64
  146. package/template/apps/web/src/components/landing/feature-card.tsx +0 -60
  147. package/template/apps/web/src/components/landing/included-feature-card.tsx +0 -63
  148. package/template/apps/web/src/components/landing/logo.tsx +0 -41
  149. package/template/apps/web/src/components/landing/tech-badge.tsx +0 -11
  150. package/template/apps/web/src/components/layout/auth-nav.tsx +0 -58
  151. package/template/apps/web/src/components/layout/footer.tsx +0 -3
  152. package/template/apps/web/src/config/landing-data.ts +0 -152
  153. package/template/apps/web/src/config/site.ts +0 -5
  154. package/template/apps/web/src/hooks/api/__tests__/use-users.test.tsx +0 -181
  155. package/template/apps/web/src/hooks/api/use-admin-sessions.ts +0 -75
  156. package/template/apps/web/src/hooks/api/use-admin-stats.ts +0 -33
  157. package/template/apps/web/src/hooks/api/use-sessions.ts +0 -52
  158. package/template/apps/web/src/hooks/api/use-uploads.ts +0 -156
  159. package/template/apps/web/src/hooks/api/use-users.ts +0 -149
  160. package/template/apps/web/src/hooks/use-mobile.ts +0 -21
  161. package/template/apps/web/src/hooks/use-realtime-metrics.ts +0 -120
  162. package/template/apps/web/src/lib/__tests__/utils.test.ts +0 -29
  163. package/template/apps/web/src/lib/api.ts +0 -151
  164. package/template/apps/web/src/lib/auth.ts +0 -13
  165. package/template/apps/web/src/lib/env.ts +0 -52
  166. package/template/apps/web/src/lib/form-utils.ts +0 -11
  167. package/template/apps/web/src/lib/utils.ts +0 -1
  168. package/template/apps/web/src/providers.tsx +0 -34
  169. package/template/apps/web/src/store/atoms.ts +0 -15
  170. package/template/apps/web/src/test/helpers/test-utils.tsx +0 -44
  171. package/template/apps/web/src/test/setup.ts +0 -8
  172. package/template/apps/web/tailwind.config.ts +0 -5
  173. package/template/apps/web/tsconfig.json +0 -26
  174. package/template/apps/web/vitest.config.ts +0 -32
  175. package/template/assets/logo-512.png +0 -0
  176. package/template/assets/logo.svg +0 -4
  177. package/template/docker-compose.prod.yml +0 -66
  178. package/template/docker-compose.yml +0 -36
  179. package/template/eslint.config.ts +0 -119
  180. package/template/package.json +0 -77
  181. package/template/packages/tailwind-config/package.json +0 -9
  182. package/template/packages/tailwind-config/theme.css +0 -179
  183. package/template/packages/types/package.json +0 -29
  184. package/template/packages/types/src/__tests__/schemas.test.ts +0 -255
  185. package/template/packages/types/src/api-response.ts +0 -53
  186. package/template/packages/types/src/health-check.ts +0 -11
  187. package/template/packages/types/src/pagination.ts +0 -41
  188. package/template/packages/types/src/role.ts +0 -5
  189. package/template/packages/types/src/session.ts +0 -48
  190. package/template/packages/types/src/stats.ts +0 -113
  191. package/template/packages/types/src/upload.ts +0 -51
  192. package/template/packages/types/src/user.ts +0 -36
  193. package/template/packages/types/tsconfig.json +0 -5
  194. package/template/packages/types/vitest.config.ts +0 -21
  195. package/template/packages/ui/components.json +0 -21
  196. package/template/packages/ui/package.json +0 -108
  197. package/template/packages/ui/src/__tests__/button.test.tsx +0 -70
  198. package/template/packages/ui/src/alert-dialog.tsx +0 -141
  199. package/template/packages/ui/src/alert.tsx +0 -66
  200. package/template/packages/ui/src/animated-theme-toggler.tsx +0 -167
  201. package/template/packages/ui/src/avatar.tsx +0 -53
  202. package/template/packages/ui/src/badge.tsx +0 -36
  203. package/template/packages/ui/src/button.tsx +0 -84
  204. package/template/packages/ui/src/card.tsx +0 -92
  205. package/template/packages/ui/src/checkbox.tsx +0 -32
  206. package/template/packages/ui/src/data-table/data-table-column-header.tsx +0 -68
  207. package/template/packages/ui/src/data-table/data-table-pagination.tsx +0 -99
  208. package/template/packages/ui/src/data-table/data-table-toolbar.tsx +0 -55
  209. package/template/packages/ui/src/data-table/data-table-view-options.tsx +0 -63
  210. package/template/packages/ui/src/data-table/data-table.tsx +0 -167
  211. package/template/packages/ui/src/dialog.tsx +0 -143
  212. package/template/packages/ui/src/dropdown-menu.tsx +0 -257
  213. package/template/packages/ui/src/empty-state.tsx +0 -52
  214. package/template/packages/ui/src/file-upload-input.tsx +0 -202
  215. package/template/packages/ui/src/form.tsx +0 -168
  216. package/template/packages/ui/src/hooks/use-mobile.ts +0 -19
  217. package/template/packages/ui/src/icons/brand-icons.tsx +0 -16
  218. package/template/packages/ui/src/input.tsx +0 -21
  219. package/template/packages/ui/src/label.tsx +0 -24
  220. package/template/packages/ui/src/lib/utils.ts +0 -6
  221. package/template/packages/ui/src/password-input.tsx +0 -102
  222. package/template/packages/ui/src/popover.tsx +0 -48
  223. package/template/packages/ui/src/radio-group.tsx +0 -45
  224. package/template/packages/ui/src/scroll-area.tsx +0 -58
  225. package/template/packages/ui/src/select.tsx +0 -187
  226. package/template/packages/ui/src/separator.tsx +0 -28
  227. package/template/packages/ui/src/sheet.tsx +0 -139
  228. package/template/packages/ui/src/sidebar.tsx +0 -726
  229. package/template/packages/ui/src/skeleton-variants.tsx +0 -87
  230. package/template/packages/ui/src/skeleton.tsx +0 -13
  231. package/template/packages/ui/src/slider.tsx +0 -63
  232. package/template/packages/ui/src/sonner.tsx +0 -25
  233. package/template/packages/ui/src/spinner.tsx +0 -16
  234. package/template/packages/ui/src/switch.tsx +0 -31
  235. package/template/packages/ui/src/table.tsx +0 -116
  236. package/template/packages/ui/src/tabs.tsx +0 -66
  237. package/template/packages/ui/src/textarea.tsx +0 -18
  238. package/template/packages/ui/src/tooltip.tsx +0 -61
  239. package/template/packages/ui/src/user-avatar.tsx +0 -97
  240. package/template/packages/ui/test-config.js +0 -3
  241. package/template/packages/ui/tsconfig.json +0 -12
  242. package/template/packages/ui/turbo.json +0 -18
  243. package/template/packages/ui/vitest.config.ts +0 -17
  244. package/template/packages/ui/vitest.setup.ts +0 -1
  245. package/template/packages/utils/package.json +0 -23
  246. package/template/packages/utils/src/__tests__/utils.test.ts +0 -223
  247. package/template/packages/utils/src/array.ts +0 -18
  248. package/template/packages/utils/src/async.ts +0 -3
  249. package/template/packages/utils/src/date.ts +0 -77
  250. package/template/packages/utils/src/errors.ts +0 -73
  251. package/template/packages/utils/src/number.ts +0 -11
  252. package/template/packages/utils/src/string.ts +0 -13
  253. package/template/packages/utils/tsconfig.json +0 -5
  254. package/template/packages/utils/vitest.config.ts +0 -21
  255. package/template/pnpm-workspace.yaml +0 -4
  256. package/template/tsconfig.base.json +0 -32
  257. package/template/turbo.json +0 -133
  258. package/template/vitest.shared.ts +0 -26
  259. package/template/vitest.workspace.ts +0 -9
@@ -1,26 +0,0 @@
1
- -- CreateTable
2
- CREATE TABLE "uploads" (
3
- "id" TEXT NOT NULL,
4
- "filename" TEXT NOT NULL,
5
- "originalName" TEXT NOT NULL,
6
- "mimeType" TEXT NOT NULL,
7
- "size" INTEGER NOT NULL,
8
- "url" TEXT NOT NULL,
9
- "userId" TEXT NOT NULL,
10
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
11
- "updatedAt" TIMESTAMP(3) NOT NULL,
12
-
13
- CONSTRAINT "uploads_pkey" PRIMARY KEY ("id")
14
- );
15
-
16
- -- CreateIndex
17
- CREATE UNIQUE INDEX "uploads_filename_key" ON "uploads"("filename");
18
-
19
- -- CreateIndex
20
- CREATE INDEX "uploads_userId_idx" ON "uploads"("userId");
21
-
22
- -- CreateIndex
23
- CREATE INDEX "uploads_createdAt_idx" ON "uploads"("createdAt");
24
-
25
- -- AddForeignKey
26
- ALTER TABLE "uploads" ADD CONSTRAINT "uploads_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,2 +0,0 @@
1
- -- AlterTable
2
- ALTER TABLE "accounts" ADD COLUMN "scope" TEXT;
@@ -1,10 +0,0 @@
1
- /*
2
- Warnings:
3
-
4
- - You are about to drop the column `expiresAt` on the `accounts` table. All the data in the column will be lost.
5
-
6
- */
7
- -- AlterTable
8
- ALTER TABLE "accounts" DROP COLUMN "expiresAt",
9
- ADD COLUMN "accessTokenExpiresAt" TIMESTAMP(3),
10
- ADD COLUMN "refreshTokenExpiresAt" TIMESTAMP(3);
@@ -1,29 +0,0 @@
1
- -- CreateTable
2
- CREATE TABLE "audit_logs" (
3
- "id" TEXT NOT NULL,
4
- "userId" TEXT NOT NULL,
5
- "action" TEXT NOT NULL,
6
- "resourceType" TEXT NOT NULL,
7
- "resourceId" TEXT,
8
- "changes" JSONB,
9
- "ipAddress" TEXT,
10
- "userAgent" TEXT,
11
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
12
-
13
- CONSTRAINT "audit_logs_pkey" PRIMARY KEY ("id")
14
- );
15
-
16
- -- CreateIndex
17
- CREATE INDEX "audit_logs_userId_idx" ON "audit_logs"("userId");
18
-
19
- -- CreateIndex
20
- CREATE INDEX "audit_logs_action_idx" ON "audit_logs"("action");
21
-
22
- -- CreateIndex
23
- CREATE INDEX "audit_logs_createdAt_idx" ON "audit_logs"("createdAt");
24
-
25
- -- CreateIndex
26
- CREATE INDEX "audit_logs_resourceType_idx" ON "audit_logs"("resourceType");
27
-
28
- -- AddForeignKey
29
- ALTER TABLE "audit_logs" ADD CONSTRAINT "audit_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
@@ -1,8 +0,0 @@
1
- /*
2
- Warnings:
3
-
4
- - You are about to drop the column `impersonatedBy` on the `sessions` table. All the data in the column will be lost.
5
-
6
- */
7
- -- AlterTable
8
- ALTER TABLE "sessions" DROP COLUMN "impersonatedBy";
@@ -1,11 +0,0 @@
1
- /*
2
- Warnings:
3
-
4
- - You are about to drop the `audit_logs` table. If the table is not empty, all the data it contains will be lost.
5
-
6
- */
7
- -- DropForeignKey
8
- ALTER TABLE "audit_logs" DROP CONSTRAINT "audit_logs_userId_fkey";
9
-
10
- -- DropTable
11
- DROP TABLE "audit_logs";
@@ -1,3 +0,0 @@
1
- # Please do not edit this file manually
2
- # It should be added in your version-control system (e.g., Git)
3
- provider = "postgresql"
@@ -1,116 +0,0 @@
1
- // This is your Prisma schema file,
2
- // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
-
4
- generator client {
5
- provider = "prisma-client"
6
- output = "../src/generated/client"
7
- }
8
-
9
- datasource db {
10
- provider = "postgresql"
11
- }
12
-
13
- // Role enum for user permissions
14
- enum Role {
15
- user
16
- admin
17
- super_admin
18
- }
19
-
20
- // User model with better-auth support
21
- model User {
22
- id String @id @default(cuid())
23
- email String @unique
24
- emailVerified Boolean @default(false)
25
- name String?
26
- image String?
27
- role Role @default(user)
28
- banned Boolean @default(false)
29
- banReason String?
30
- banExpires DateTime?
31
- createdAt DateTime @default(now())
32
- updatedAt DateTime @updatedAt
33
-
34
- sessions Session[]
35
- accounts Account[]
36
- uploads Upload[]
37
-
38
- @@map("users")
39
- }
40
-
41
- // Session model for better-auth
42
- model Session {
43
- id String @id @default(cuid())
44
- userId String
45
- expiresAt DateTime
46
- token String @unique
47
- ipAddress String?
48
- userAgent String?
49
- createdAt DateTime @default(now())
50
- updatedAt DateTime @updatedAt
51
-
52
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
53
-
54
- @@index([userId])
55
- @@index([expiresAt])
56
- @@map("sessions")
57
- }
58
-
59
- // Account model for OAuth providers
60
- // IMPORTANT: This schema MUST match Better Auth's expected fields exactly
61
- // Do NOT modify field names without checking Better Auth documentation
62
- // https://www.better-auth.com/docs/concepts/database#account-model
63
- model Account {
64
- id String @id @default(cuid())
65
- userId String
66
- accountId String
67
- providerId String
68
- accessToken String?
69
- refreshToken String?
70
- idToken String?
71
- accessTokenExpiresAt DateTime? // OAuth access token expiration
72
- refreshTokenExpiresAt DateTime? // OAuth refresh token expiration
73
- scope String? // OAuth scopes granted
74
- password String? // For credential provider (email/password)
75
- createdAt DateTime @default(now())
76
- updatedAt DateTime @updatedAt
77
-
78
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
79
-
80
- @@unique([providerId, accountId])
81
- @@index([userId])
82
- @@map("accounts")
83
- }
84
-
85
- // Verification model for email verification and password reset
86
- model Verification {
87
- id String @id @default(cuid())
88
- identifier String
89
- value String
90
- expiresAt DateTime
91
- createdAt DateTime @default(now())
92
- updatedAt DateTime @updatedAt
93
-
94
- @@unique([identifier, value])
95
- @@map("verifications")
96
- }
97
-
98
- // Upload model for file tracking
99
- model Upload {
100
- id String @id @default(cuid())
101
- filename String @unique // stored filename (unique)
102
- originalName String // user's original filename
103
- mimeType String
104
- size Int // bytes
105
- url String // public URL
106
- userId String
107
- createdAt DateTime @default(now())
108
- updatedAt DateTime @updatedAt
109
-
110
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
111
-
112
- @@index([userId])
113
- @@index([createdAt])
114
- @@map("uploads")
115
- }
116
-
@@ -1,159 +0,0 @@
1
- import 'dotenv-flow/config';
2
-
3
- import { PrismaPg } from '@prisma/adapter-pg';
4
- import { betterAuth } from 'better-auth';
5
- import { prismaAdapter } from 'better-auth/adapters/prisma';
6
- import { admin } from 'better-auth/plugins';
7
- import { Pool } from 'pg';
8
-
9
- import { PrismaClient, Role } from '../src/generated/client/client.js';
10
-
11
- const pool = new Pool({ connectionString: process.env.DATABASE_URL });
12
- const adapter = new PrismaPg(pool);
13
- const prisma = new PrismaClient({ adapter });
14
-
15
- const auth = betterAuth({
16
- database: prismaAdapter(prisma, {
17
- provider: 'postgresql',
18
- }),
19
- baseURL: 'http://localhost:8080',
20
- secret: 'temp-seed-secret',
21
- emailAndPassword: {
22
- enabled: true,
23
- },
24
- plugins: [
25
- admin({
26
- defaultRole: 'user',
27
- adminRoles: ['admin', 'super_admin'],
28
- }),
29
- ],
30
- });
31
-
32
- async function main() {
33
- console.log('🌱 Seeding database...');
34
-
35
- // SAFETY: Block seeding in production
36
- if (process.env.NODE_ENV === 'production') {
37
- console.error('❌ SAFETY ERROR: Seed script is blocked in production!');
38
- console.error(
39
- ' Test accounts with weak passwords should NEVER be created in production.'
40
- );
41
- console.error(
42
- ' If you need to seed production data, create a separate seed-prod.ts file.'
43
- );
44
- process.exit(1);
45
- }
46
-
47
- console.log(`📍 Environment: ${process.env.NODE_ENV || 'development'}`);
48
-
49
- // Delete all existing test accounts first
50
- await prisma.account.deleteMany({
51
- where: {
52
- providerId: 'credential',
53
- accountId: {
54
- in: [
55
- 'admin@example.com',
56
- 'alice@example.com',
57
- 'bob@example.com',
58
- 'charlie@example.com',
59
- ],
60
- },
61
- },
62
- });
63
-
64
- await prisma.user.deleteMany({
65
- where: {
66
- email: {
67
- in: [
68
- 'admin@example.com',
69
- 'alice@example.com',
70
- 'bob@example.com',
71
- 'charlie@example.com',
72
- ],
73
- },
74
- },
75
- });
76
-
77
- console.log('🗑️ Cleaned up existing test accounts');
78
-
79
- const usersData = [
80
- {
81
- email: 'admin@example.com',
82
- name: 'Super Admin',
83
- password: 'Admin@123456',
84
- role: Role.super_admin,
85
- emailVerified: true,
86
- },
87
- {
88
- email: 'alice@example.com',
89
- name: 'Alice Johnson',
90
- password: 'Alice@123456',
91
- role: Role.user,
92
- emailVerified: false,
93
- },
94
- {
95
- email: 'bob@example.com',
96
- name: 'Bob Smith',
97
- password: 'Bob@123456',
98
- role: Role.admin,
99
- emailVerified: false,
100
- },
101
- {
102
- email: 'charlie@example.com',
103
- name: 'Charlie Davis',
104
- password: 'Charlie@123456',
105
- role: Role.user,
106
- emailVerified: false,
107
- },
108
- ];
109
-
110
- for (const userData of usersData) {
111
- // Create user with Better Auth (this handles password hashing correctly)
112
- const response = await auth.api.signUpEmail({
113
- body: {
114
- email: userData.email,
115
- password: userData.password,
116
- name: userData.name,
117
- },
118
- });
119
-
120
- if (!response || !response.user) {
121
- console.error(`❌ Failed to create user: ${userData.email}`);
122
- continue;
123
- }
124
-
125
- // Update user role and email verification status
126
- await prisma.user.update({
127
- where: { id: response.user.id },
128
- data: {
129
- role: userData.role,
130
- emailVerified: userData.emailVerified,
131
- },
132
- });
133
-
134
- console.log(
135
- `✅ Created: ${userData.email} (${userData.role}) - emailVerified: ${userData.emailVerified}`
136
- );
137
- }
138
-
139
- console.log('');
140
- console.log('✅ Database seeded successfully!');
141
- console.log('');
142
- console.log('Test accounts:');
143
- console.log(' admin@example.com / Admin@123456 (super_admin)');
144
- console.log(' alice@example.com / Alice@123456 (user)');
145
- console.log(' bob@example.com / Bob@123456 (admin)');
146
- console.log(' charlie@example.com / Charlie@123456 (user)');
147
- console.log('');
148
- console.log('⚠️ IMPORTANT: Change passwords after first login!');
149
- }
150
-
151
- main()
152
- .catch((e) => {
153
- console.error('❌ Seed failed:', e);
154
- process.exit(1);
155
- })
156
- .finally(async () => {
157
- await prisma.$disconnect();
158
- await pool.end();
159
- });
@@ -1,14 +0,0 @@
1
- import 'dotenv-flow/config';
2
-
3
- import { defineConfig, env } from 'prisma/config';
4
-
5
- export default defineConfig({
6
- schema: 'prisma/schema.prisma',
7
- migrations: {
8
- path: 'prisma/migrations',
9
- seed: 'tsx prisma/seed.ts',
10
- },
11
- datasource: {
12
- url: env('DATABASE_URL'),
13
- },
14
- });