create-zhx-monorepo 0.2.2 → 2.0.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 (349) hide show
  1. package/README.md +1 -1
  2. package/bin/index.js +0 -0
  3. package/package.json +3 -3
  4. package/templates/monorepo-starter/apps/dashboard/components.json +20 -0
  5. package/templates/monorepo-starter/apps/dashboard/eslint.config.js +1 -0
  6. package/templates/monorepo-starter/apps/dashboard/next-env.d.ts +6 -0
  7. package/templates/monorepo-starter/apps/dashboard/next.config.mjs +30 -0
  8. package/templates/monorepo-starter/apps/dashboard/package.json +43 -0
  9. package/templates/monorepo-starter/apps/dashboard/postcss.config.mjs +1 -0
  10. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/edit/page.tsx +8 -0
  11. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/[id]/page.tsx +104 -0
  12. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/new/page.tsx +7 -0
  13. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/admin/users/page.tsx +88 -0
  14. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/data.json +614 -0
  15. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/dashboard/page.tsx +21 -0
  16. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/layout.tsx +40 -0
  17. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/media/page.tsx +7 -0
  18. package/templates/monorepo-starter/apps/dashboard/src/app/(root)/users/account/page.tsx +75 -0
  19. package/templates/monorepo-starter/apps/dashboard/src/app/auth/[type]/page.tsx +19 -0
  20. package/templates/monorepo-starter/apps/dashboard/src/app/auth/layout.tsx +11 -0
  21. package/templates/monorepo-starter/apps/dashboard/src/app/auth/verify/page.tsx +11 -0
  22. package/templates/monorepo-starter/apps/dashboard/src/app/favicon.ico +0 -0
  23. package/templates/monorepo-starter/apps/dashboard/src/app/layout.tsx +28 -0
  24. package/templates/monorepo-starter/apps/dashboard/src/components/forms/AuthForm.tsx +345 -0
  25. package/templates/monorepo-starter/apps/dashboard/src/components/forms/CUUserForm.tsx +223 -0
  26. package/templates/monorepo-starter/apps/dashboard/src/components/forms/MediaForm.tsx +35 -0
  27. package/templates/monorepo-starter/apps/dashboard/src/components/forms/SocialAuthField.tsx +56 -0
  28. package/templates/monorepo-starter/apps/dashboard/src/components/layout/AppSidebar.tsx +141 -0
  29. package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardChart.tsx +293 -0
  30. package/templates/monorepo-starter/apps/dashboard/src/components/layout/DashboardStats.tsx +104 -0
  31. package/templates/monorepo-starter/apps/dashboard/src/components/layout/Header.tsx +21 -0
  32. package/templates/monorepo-starter/apps/dashboard/src/components/layout/NavMain.tsx +99 -0
  33. package/templates/monorepo-starter/apps/dashboard/src/components/media/LibraryPopup.tsx +25 -0
  34. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaCard.tsx +175 -0
  35. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaDetails.tsx +58 -0
  36. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaGrid.tsx +51 -0
  37. package/templates/monorepo-starter/apps/dashboard/src/components/media/MediaUploader.tsx +182 -0
  38. package/templates/monorepo-starter/apps/dashboard/src/components/media/index.tsx +96 -0
  39. package/templates/monorepo-starter/apps/dashboard/src/components/shared/DateWrapper.tsx +43 -0
  40. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericArrayField.tsx +189 -0
  41. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericCUForm.tsx +124 -0
  42. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericDetailsPage.tsx +291 -0
  43. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericFormTable.tsx +189 -0
  44. package/templates/monorepo-starter/apps/dashboard/src/components/shared/GenericTable.tsx +244 -0
  45. package/templates/monorepo-starter/apps/dashboard/src/components/shared/ListPage.tsx +134 -0
  46. package/templates/monorepo-starter/apps/dashboard/src/components/shared/Pagination.tsx +120 -0
  47. package/templates/monorepo-starter/apps/dashboard/src/components/shared/SearchToolbar.tsx +133 -0
  48. package/templates/monorepo-starter/apps/dashboard/src/components/shared/ThemeSwitch.tsx +41 -0
  49. package/templates/monorepo-starter/apps/dashboard/src/components/shared/VerifyAuthPage.tsx +109 -0
  50. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/CUFormSkeleton.tsx +31 -0
  51. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DashboardSke1eton.tsx +135 -0
  52. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/DetailsPageSkeleton.tsx +64 -0
  53. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/RootLayoutSkeleton.tsx +106 -0
  54. package/templates/monorepo-starter/apps/dashboard/src/components/skeleton/TableSkeleton.tsx +77 -0
  55. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserAccountSection.tsx +530 -0
  56. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserCard.tsx +54 -0
  57. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserProfileSection.tsx +239 -0
  58. package/templates/monorepo-starter/apps/dashboard/src/components/user/UserSessions.tsx +154 -0
  59. package/templates/monorepo-starter/apps/dashboard/src/hooks/admin.ts +100 -0
  60. package/templates/monorepo-starter/apps/dashboard/src/hooks/auth.ts +59 -0
  61. package/templates/monorepo-starter/apps/dashboard/src/hooks/crud.ts +275 -0
  62. package/templates/monorepo-starter/apps/dashboard/src/hooks/lookup.ts +38 -0
  63. package/templates/monorepo-starter/apps/dashboard/src/hooks/media.ts +34 -0
  64. package/templates/monorepo-starter/apps/dashboard/src/hooks/user.ts +58 -0
  65. package/templates/monorepo-starter/apps/dashboard/src/lib/constants.ts +61 -0
  66. package/templates/monorepo-starter/apps/dashboard/src/providers/index.tsx +15 -0
  67. package/templates/monorepo-starter/apps/dashboard/src/providers/media-library.tsx +48 -0
  68. package/templates/monorepo-starter/apps/dashboard/tsconfig.json +20 -0
  69. package/templates/monorepo-starter/apps/web/components.json +20 -20
  70. package/templates/monorepo-starter/apps/web/eslint.config.js +1 -0
  71. package/templates/monorepo-starter/apps/web/next-env.d.ts +6 -6
  72. package/templates/monorepo-starter/apps/web/next.config.mjs +20 -6
  73. package/templates/monorepo-starter/apps/web/package.json +36 -31
  74. package/templates/monorepo-starter/apps/web/postcss.config.mjs +1 -1
  75. package/templates/monorepo-starter/apps/web/src/app/(root)/layout.tsx +2 -2
  76. package/templates/monorepo-starter/apps/web/src/app/favicon.ico +0 -0
  77. package/templates/monorepo-starter/apps/web/src/app/layout.tsx +13 -9
  78. package/templates/monorepo-starter/apps/web/src/components/Footer.tsx +5 -7
  79. package/templates/monorepo-starter/apps/web/src/components/Header.tsx +5 -9
  80. package/templates/monorepo-starter/apps/web/tsconfig.json +20 -20
  81. package/templates/monorepo-starter/eslint.config.mjs +1 -1
  82. package/templates/monorepo-starter/gitignore +13 -4
  83. package/templates/monorepo-starter/package.json +49 -23
  84. package/templates/monorepo-starter/packages/config/eslint/next.mjs +18 -0
  85. package/templates/monorepo-starter/packages/config/eslint/node.mjs +44 -0
  86. package/templates/monorepo-starter/packages/config/eslint/react.mjs +68 -0
  87. package/templates/monorepo-starter/packages/config/package.json +23 -32
  88. package/templates/monorepo-starter/packages/config/typescript/node.json +25 -0
  89. package/templates/monorepo-starter/packages/config/typescript/react.json +20 -3
  90. package/templates/monorepo-starter/packages/contracts/eslint.config.mjs +1 -0
  91. package/templates/monorepo-starter/packages/contracts/package.json +51 -0
  92. package/templates/monorepo-starter/packages/contracts/src/admin/dto.ts +6 -0
  93. package/templates/monorepo-starter/packages/contracts/src/admin/index.ts +2 -0
  94. package/templates/monorepo-starter/packages/contracts/src/admin/schema.ts +28 -0
  95. package/templates/monorepo-starter/packages/contracts/src/admin/types.d.ts +27 -0
  96. package/templates/monorepo-starter/packages/contracts/src/auth/dto.ts +24 -0
  97. package/templates/monorepo-starter/packages/contracts/src/auth/index.ts +2 -0
  98. package/templates/monorepo-starter/packages/contracts/src/auth/schema.ts +35 -0
  99. package/templates/monorepo-starter/packages/contracts/src/auth/types.d.ts +73 -0
  100. package/templates/monorepo-starter/packages/contracts/src/lib/enums.ts +55 -0
  101. package/templates/monorepo-starter/packages/contracts/src/lib/index.ts +4 -0
  102. package/templates/monorepo-starter/packages/contracts/src/lib/prisma.ts +2 -0
  103. package/templates/monorepo-starter/packages/contracts/src/lib/schema.ts +61 -0
  104. package/templates/monorepo-starter/packages/contracts/src/lib/types.d.ts +149 -0
  105. package/templates/monorepo-starter/packages/contracts/src/lib/utils.ts +8 -0
  106. package/templates/monorepo-starter/packages/contracts/src/media/dto.ts +12 -0
  107. package/templates/monorepo-starter/packages/contracts/src/media/index.ts +2 -0
  108. package/templates/monorepo-starter/packages/contracts/src/media/schema.ts +27 -0
  109. package/templates/monorepo-starter/packages/contracts/src/media/types.d.ts +36 -0
  110. package/templates/monorepo-starter/packages/contracts/src/notification/dto.ts +6 -0
  111. package/templates/monorepo-starter/packages/contracts/src/notification/index.ts +2 -0
  112. package/templates/monorepo-starter/packages/contracts/src/notification/schema.ts +7 -0
  113. package/templates/monorepo-starter/packages/contracts/src/notification/types.d.ts +22 -0
  114. package/templates/monorepo-starter/packages/contracts/src/user/dto.ts +4 -0
  115. package/templates/monorepo-starter/packages/contracts/src/user/index.ts +2 -0
  116. package/templates/monorepo-starter/packages/contracts/src/user/schema.ts +16 -0
  117. package/templates/monorepo-starter/packages/contracts/src/user/types.d.ts +36 -0
  118. package/templates/monorepo-starter/packages/contracts/tsconfig.json +12 -0
  119. package/templates/monorepo-starter/packages/contracts/tsup.config.ts +20 -0
  120. package/templates/monorepo-starter/packages/sdk/eslint.config.mjs +1 -0
  121. package/templates/monorepo-starter/packages/sdk/package.json +31 -0
  122. package/templates/monorepo-starter/packages/sdk/src/admin/index.ts +31 -0
  123. package/templates/monorepo-starter/packages/sdk/src/auth/index.ts +71 -0
  124. package/templates/monorepo-starter/packages/sdk/src/lib/api-client.ts +71 -0
  125. package/templates/monorepo-starter/packages/sdk/src/lib/index.ts +2 -0
  126. package/templates/monorepo-starter/packages/sdk/src/lib/types.ts +40 -0
  127. package/templates/monorepo-starter/packages/sdk/src/media/index.ts +27 -0
  128. package/templates/monorepo-starter/packages/sdk/src/notification/index.ts +10 -0
  129. package/templates/monorepo-starter/packages/sdk/src/public/index.ts +6 -0
  130. package/templates/monorepo-starter/packages/sdk/src/user/index.ts +7 -0
  131. package/templates/monorepo-starter/packages/sdk/tsconfig.json +12 -0
  132. package/templates/monorepo-starter/packages/shared/eslint.config.mjs +1 -0
  133. package/templates/monorepo-starter/packages/shared/package.json +36 -0
  134. package/templates/monorepo-starter/packages/shared/src/constants/app.ts +4 -0
  135. package/templates/monorepo-starter/packages/shared/src/constants/index.ts +1 -0
  136. package/templates/monorepo-starter/packages/shared/src/utils/date.ts +137 -0
  137. package/templates/monorepo-starter/packages/shared/src/utils/identifier.ts +11 -0
  138. package/templates/monorepo-starter/packages/shared/src/utils/index.ts +2 -0
  139. package/templates/monorepo-starter/packages/shared/tsconfig.json +12 -0
  140. package/templates/monorepo-starter/packages/shared/tsup.config.ts +16 -0
  141. package/templates/monorepo-starter/packages/templates/eslint.config.mjs +1 -0
  142. package/templates/monorepo-starter/packages/templates/package.json +38 -0
  143. package/templates/monorepo-starter/packages/templates/src/email/auth/disableMfa.tsx +40 -0
  144. package/templates/monorepo-starter/packages/templates/src/email/auth/index.ts +10 -0
  145. package/templates/monorepo-starter/packages/templates/src/email/auth/resetPassword.tsx +41 -0
  146. package/templates/monorepo-starter/packages/templates/src/email/auth/securityAlert.tsx +21 -0
  147. package/templates/monorepo-starter/packages/templates/src/email/auth/setPassword.tsx +42 -0
  148. package/templates/monorepo-starter/packages/templates/src/email/auth/signin.tsx +19 -0
  149. package/templates/monorepo-starter/packages/templates/src/email/auth/signup.tsx +24 -0
  150. package/templates/monorepo-starter/packages/templates/src/email/auth/updateIdentifier.tsx +79 -0
  151. package/templates/monorepo-starter/packages/templates/src/email/auth/updateMfa.tsx +40 -0
  152. package/templates/monorepo-starter/packages/templates/src/email/auth/verifyIdentifier.tsx +42 -0
  153. package/templates/monorepo-starter/packages/templates/src/email/auth/verifyMfa.tsx +23 -0
  154. package/templates/monorepo-starter/packages/templates/src/email/components/actionBlock.tsx +39 -0
  155. package/templates/monorepo-starter/packages/templates/src/email/components/footer.tsx +0 -0
  156. package/templates/monorepo-starter/packages/templates/src/email/components/greeting.tsx +11 -0
  157. package/templates/monorepo-starter/packages/templates/src/email/components/header.tsx +15 -0
  158. package/templates/monorepo-starter/packages/templates/src/email/components/layout.tsx +33 -0
  159. package/templates/monorepo-starter/packages/templates/src/email/components/numericCode.tsx +16 -0
  160. package/templates/monorepo-starter/packages/templates/src/email/index.ts +2 -0
  161. package/templates/monorepo-starter/packages/templates/src/email/service/accountReactivated.tsx +31 -0
  162. package/templates/monorepo-starter/packages/templates/src/email/service/accountSuspended.tsx +37 -0
  163. package/templates/monorepo-starter/packages/templates/src/email/service/index.ts +2 -0
  164. package/templates/monorepo-starter/packages/templates/src/email/test.tsx +141 -0
  165. package/templates/monorepo-starter/packages/templates/src/index.ts +1 -0
  166. package/templates/monorepo-starter/packages/templates/src/lib/constants.ts +22 -0
  167. package/templates/monorepo-starter/packages/templates/src/lib/utils.ts +19 -0
  168. package/templates/monorepo-starter/packages/templates/src/types/global.d.ts +37 -0
  169. package/templates/monorepo-starter/packages/templates/tsconfig.json +13 -0
  170. package/templates/monorepo-starter/packages/templates/tsup.config.ts +23 -0
  171. package/templates/monorepo-starter/packages/ui/components.json +1 -1
  172. package/templates/monorepo-starter/packages/ui/eslint.config.mjs +1 -4
  173. package/templates/monorepo-starter/packages/ui/package.json +81 -38
  174. package/templates/monorepo-starter/packages/ui/src/components/accordion.tsx +66 -0
  175. package/templates/monorepo-starter/packages/ui/src/components/airport-search-field.tsx +203 -0
  176. package/templates/monorepo-starter/packages/ui/src/components/alert-dialog.tsx +157 -0
  177. package/templates/monorepo-starter/packages/ui/src/components/alert.tsx +66 -0
  178. package/templates/monorepo-starter/packages/ui/src/components/aspect-ratio.tsx +11 -0
  179. package/templates/monorepo-starter/packages/ui/src/components/avatar.tsx +53 -0
  180. package/templates/monorepo-starter/packages/ui/src/components/badge.tsx +46 -0
  181. package/templates/monorepo-starter/packages/ui/src/components/breadcrumb.tsx +109 -0
  182. package/templates/monorepo-starter/packages/ui/src/components/button-group.tsx +83 -0
  183. package/templates/monorepo-starter/packages/ui/src/components/button.tsx +2 -1
  184. package/templates/monorepo-starter/packages/ui/src/components/calendar.tsx +220 -0
  185. package/templates/monorepo-starter/packages/ui/src/components/card.tsx +92 -0
  186. package/templates/monorepo-starter/packages/ui/src/components/carousel.tsx +241 -0
  187. package/templates/monorepo-starter/packages/ui/src/components/chart.tsx +357 -0
  188. package/templates/monorepo-starter/packages/ui/src/components/checkbox.tsx +32 -0
  189. package/templates/monorepo-starter/packages/ui/src/components/collapsible.tsx +33 -0
  190. package/templates/monorepo-starter/packages/ui/src/components/combobox-field.tsx +181 -0
  191. package/templates/monorepo-starter/packages/ui/src/components/combobox.tsx +309 -0
  192. package/templates/monorepo-starter/packages/ui/src/components/command.tsx +184 -0
  193. package/templates/monorepo-starter/packages/ui/src/components/context-menu.tsx +252 -0
  194. package/templates/monorepo-starter/packages/ui/src/components/date-field.tsx +65 -0
  195. package/templates/monorepo-starter/packages/ui/src/components/dialog.tsx +143 -0
  196. package/templates/monorepo-starter/packages/ui/src/components/direction.tsx +22 -0
  197. package/templates/monorepo-starter/packages/ui/src/components/drawer.tsx +135 -0
  198. package/templates/monorepo-starter/packages/ui/src/components/dropdown-menu.tsx +257 -0
  199. package/templates/monorepo-starter/packages/ui/src/components/empty.tsx +104 -0
  200. package/templates/monorepo-starter/packages/ui/src/components/field.tsx +248 -0
  201. package/templates/monorepo-starter/packages/ui/src/components/form.tsx +197 -0
  202. package/templates/monorepo-starter/packages/ui/src/components/hover-card.tsx +44 -0
  203. package/templates/monorepo-starter/packages/ui/src/components/input-field.tsx +116 -0
  204. package/templates/monorepo-starter/packages/ui/src/components/input-group.tsx +170 -0
  205. package/templates/monorepo-starter/packages/ui/src/components/input-otp.tsx +77 -0
  206. package/templates/monorepo-starter/packages/ui/src/components/input.tsx +44 -0
  207. package/templates/monorepo-starter/packages/ui/src/components/item.tsx +193 -0
  208. package/templates/monorepo-starter/packages/ui/src/components/kbd.tsx +28 -0
  209. package/templates/monorepo-starter/packages/ui/src/components/label.tsx +24 -0
  210. package/templates/monorepo-starter/packages/ui/src/components/menubar.tsx +276 -0
  211. package/templates/monorepo-starter/packages/ui/src/components/native-select.tsx +53 -0
  212. package/templates/monorepo-starter/packages/ui/src/components/navigation-menu.tsx +168 -0
  213. package/templates/monorepo-starter/packages/ui/src/components/otp-modal.tsx +125 -0
  214. package/templates/monorepo-starter/packages/ui/src/components/pagination.tsx +127 -0
  215. package/templates/monorepo-starter/packages/ui/src/components/popover.tsx +48 -0
  216. package/templates/monorepo-starter/packages/ui/src/components/progress.tsx +31 -0
  217. package/templates/monorepo-starter/packages/ui/src/components/radio-group.tsx +45 -0
  218. package/templates/monorepo-starter/packages/ui/src/components/resizable.tsx +53 -0
  219. package/templates/monorepo-starter/packages/ui/src/components/scroll-area.tsx +58 -0
  220. package/templates/monorepo-starter/packages/ui/src/components/select-field.tsx +165 -0
  221. package/templates/monorepo-starter/packages/ui/src/components/select.tsx +190 -0
  222. package/templates/monorepo-starter/packages/ui/src/components/separator.tsx +28 -0
  223. package/templates/monorepo-starter/packages/ui/src/components/sheet.tsx +139 -0
  224. package/templates/monorepo-starter/packages/ui/src/components/sidebar.tsx +728 -0
  225. package/templates/monorepo-starter/packages/ui/src/components/skeleton.tsx +13 -0
  226. package/templates/monorepo-starter/packages/ui/src/components/slider.tsx +63 -0
  227. package/templates/monorepo-starter/packages/ui/src/components/sonner.tsx +57 -0
  228. package/templates/monorepo-starter/packages/ui/src/components/spinner.tsx +16 -0
  229. package/templates/monorepo-starter/packages/ui/src/components/switch-field.tsx +22 -0
  230. package/templates/monorepo-starter/packages/ui/src/components/switch.tsx +35 -0
  231. package/templates/monorepo-starter/packages/ui/src/components/table.tsx +120 -0
  232. package/templates/monorepo-starter/packages/ui/src/components/tabs.tsx +66 -0
  233. package/templates/monorepo-starter/packages/ui/src/components/textarea.tsx +18 -0
  234. package/templates/monorepo-starter/packages/ui/src/components/toggle-group.tsx +83 -0
  235. package/templates/monorepo-starter/packages/ui/src/components/toggle.tsx +47 -0
  236. package/templates/monorepo-starter/packages/ui/src/components/tooltip.tsx +61 -0
  237. package/templates/monorepo-starter/packages/ui/src/hooks/use-confirm.ts +12 -0
  238. package/templates/monorepo-starter/packages/ui/src/hooks/use-dialog.ts +12 -0
  239. package/templates/monorepo-starter/packages/ui/src/hooks/use-mobile.ts +21 -0
  240. package/templates/monorepo-starter/packages/ui/src/lib/utils.ts +38 -3
  241. package/templates/monorepo-starter/packages/ui/src/provider/confirm-dialog.tsx +99 -0
  242. package/templates/monorepo-starter/packages/ui/src/provider/dialog.tsx +62 -0
  243. package/templates/monorepo-starter/packages/ui/src/provider/index.tsx +30 -0
  244. package/templates/monorepo-starter/packages/ui/src/provider/react-query.tsx +11 -0
  245. package/templates/monorepo-starter/{apps/web/src/providers → packages/ui/src/provider}/theme.tsx +5 -7
  246. package/templates/monorepo-starter/packages/ui/src/styles/globals.css +109 -61
  247. package/templates/monorepo-starter/packages/ui/src/types/airports-data.d.ts +21 -0
  248. package/templates/monorepo-starter/packages/ui/tsconfig.json +1 -3
  249. package/templates/monorepo-starter/pnpm-lock.yaml +17765 -12441
  250. package/templates/monorepo-starter/pnpm-workspace.yaml +3 -16
  251. package/templates/monorepo-starter/server/.env.example +7 -5
  252. package/templates/monorepo-starter/server/eslint.config.mjs +1 -4
  253. package/templates/monorepo-starter/server/package.json +129 -97
  254. package/templates/monorepo-starter/server/prisma/schema.prisma +170 -92
  255. package/templates/monorepo-starter/server/prisma/seed-functions.ts +0 -0
  256. package/templates/monorepo-starter/server/prisma/seed.ts +0 -0
  257. package/templates/monorepo-starter/server/prisma.config.ts +9 -9
  258. package/templates/monorepo-starter/server/scripts/admin-bootstrap.ts +61 -0
  259. package/templates/monorepo-starter/server/scripts/gen-module.sh +20 -0
  260. package/templates/monorepo-starter/server/scripts/gen-soft-delete.ts +52 -0
  261. package/templates/monorepo-starter/server/src/app.module.ts +35 -28
  262. package/templates/monorepo-starter/server/src/lib/constants/index.ts +59 -0
  263. package/templates/monorepo-starter/server/src/lib/decorators/boolean-query.decorator.ts +18 -0
  264. package/templates/monorepo-starter/server/src/lib/decorators/logger.decorator.ts +1 -1
  265. package/templates/monorepo-starter/server/src/lib/decorators/oauth.decorator.ts +7 -0
  266. package/templates/monorepo-starter/server/src/lib/decorators/user.decorator.ts +10 -0
  267. package/templates/monorepo-starter/server/src/lib/filters/exceptions.filter.ts +169 -24
  268. package/templates/monorepo-starter/server/src/lib/guards/auth.guard.ts +29 -65
  269. package/templates/monorepo-starter/server/src/lib/guards/oauth.guard.ts +28 -0
  270. package/templates/monorepo-starter/server/src/lib/interceptors/response.interceptor.ts +42 -5
  271. package/templates/monorepo-starter/server/src/lib/middleware/cache.middleware.ts +24 -0
  272. package/templates/monorepo-starter/server/src/lib/schemas/env.schema.ts +25 -5
  273. package/templates/monorepo-starter/server/src/lib/utils/client.utils.ts +95 -0
  274. package/templates/monorepo-starter/server/src/lib/utils/cookie.util.ts +4 -3
  275. package/templates/monorepo-starter/server/src/main.ts +20 -10
  276. package/templates/monorepo-starter/server/src/modules/admin/admin.controller.ts +54 -0
  277. package/templates/monorepo-starter/server/src/modules/admin/admin.module.ts +13 -0
  278. package/templates/monorepo-starter/server/src/modules/admin/admin.service.ts +134 -0
  279. package/templates/monorepo-starter/server/src/modules/auth/auth.controller.ts +60 -18
  280. package/templates/monorepo-starter/server/src/modules/auth/auth.module.ts +3 -2
  281. package/templates/monorepo-starter/server/src/modules/auth/auth.service.ts +354 -307
  282. package/templates/monorepo-starter/server/src/modules/auth/oauth.controller.ts +50 -28
  283. package/templates/monorepo-starter/server/src/modules/auth/oauth.service.ts +59 -34
  284. package/templates/monorepo-starter/server/src/modules/auth/otp.service.ts +29 -36
  285. package/templates/monorepo-starter/server/src/modules/cache/cache.module.ts +28 -0
  286. package/templates/monorepo-starter/server/src/modules/cache/cache.service.ts +33 -0
  287. package/templates/monorepo-starter/server/src/modules/env/env.service.ts +4 -3
  288. package/templates/monorepo-starter/server/src/modules/logger/logger.module.ts +1 -0
  289. package/templates/monorepo-starter/server/src/modules/logger/logger.service.ts +1 -1
  290. package/templates/monorepo-starter/server/src/modules/logger/winston.config.ts +15 -1
  291. package/templates/monorepo-starter/server/src/modules/media/cloudinary.provider.ts +14 -0
  292. package/templates/monorepo-starter/server/src/modules/media/cloudinary.service.ts +62 -0
  293. package/templates/monorepo-starter/server/src/modules/media/media.controller.ts +72 -0
  294. package/templates/monorepo-starter/server/src/modules/media/media.module.ts +13 -0
  295. package/templates/monorepo-starter/server/src/modules/media/media.service.ts +146 -0
  296. package/templates/monorepo-starter/server/src/modules/notification/email.service.ts +30 -0
  297. package/templates/monorepo-starter/server/src/modules/notification/messaging.service.ts +50 -0
  298. package/templates/monorepo-starter/server/src/modules/notification/notification.controller.ts +44 -0
  299. package/templates/monorepo-starter/server/src/modules/notification/notification.module.ts +7 -3
  300. package/templates/monorepo-starter/server/src/modules/notification/notification.service.ts +121 -78
  301. package/templates/monorepo-starter/server/src/modules/notification/push.service.ts +92 -0
  302. package/templates/monorepo-starter/server/src/modules/prisma/prisma.extension.ts +84 -56
  303. package/templates/monorepo-starter/server/src/modules/prisma/prisma.service.ts +10 -9
  304. package/templates/monorepo-starter/server/src/modules/prisma/soft-delete.models.ts +7 -0
  305. package/templates/monorepo-starter/server/src/modules/public/public.controller.ts +3 -2
  306. package/templates/monorepo-starter/server/src/modules/public/public.module.ts +5 -4
  307. package/templates/monorepo-starter/server/src/modules/public/public.service.ts +7 -4
  308. package/templates/monorepo-starter/server/src/modules/scheduler/cleanup.service.ts +15 -7
  309. package/templates/monorepo-starter/server/src/modules/scheduler/scheduler.module.ts +2 -0
  310. package/templates/monorepo-starter/server/src/modules/token/token.module.ts +3 -4
  311. package/templates/monorepo-starter/server/src/modules/token/token.service.ts +205 -76
  312. package/templates/monorepo-starter/server/src/modules/user/user.controller.ts +21 -0
  313. package/templates/monorepo-starter/server/src/modules/user/user.module.ts +12 -0
  314. package/templates/monorepo-starter/server/src/modules/user/user.service.ts +38 -0
  315. package/templates/monorepo-starter/server/src/types/express.d.ts +6 -2
  316. package/templates/monorepo-starter/server/src/types/index.ts +5 -0
  317. package/templates/monorepo-starter/server/tsconfig.json +17 -12
  318. package/templates/monorepo-starter/server/tsup.config.ts +7 -2
  319. package/templates/monorepo-starter/tsconfig.json +1 -1
  320. package/templates/monorepo-starter/turbo.json +1 -1
  321. package/templates/monorepo-starter/apps/web/eslint.config.mjs +0 -4
  322. package/templates/monorepo-starter/apps/web/src/app/(auth)/layout.tsx +0 -7
  323. package/templates/monorepo-starter/apps/web/src/app/globals.css +0 -1
  324. package/templates/monorepo-starter/apps/web/src/components/ThemeSwitch.tsx +0 -34
  325. package/templates/monorepo-starter/apps/web/src/providers/index.tsx +0 -10
  326. package/templates/monorepo-starter/apps/web/src/types/index.d.ts +0 -16
  327. package/templates/monorepo-starter/packages/config/eslint/base.js +0 -31
  328. package/templates/monorepo-starter/packages/config/eslint/nest.js +0 -26
  329. package/templates/monorepo-starter/packages/config/eslint/next.js +0 -39
  330. package/templates/monorepo-starter/packages/config/eslint/react.js +0 -30
  331. package/templates/monorepo-starter/packages/config/typescript/base.json +0 -31
  332. package/templates/monorepo-starter/packages/config/typescript/nest.json +0 -14
  333. package/templates/monorepo-starter/packages/config/typescript/next.json +0 -10
  334. package/templates/monorepo-starter/packages/ui/tsconfig.lint.json +0 -8
  335. package/templates/monorepo-starter/server/README.md +0 -63
  336. package/templates/monorepo-starter/server/scripts/generate.sh +0 -14
  337. package/templates/monorepo-starter/server/src/lib/dto/auth.dto.ts +0 -64
  338. package/templates/monorepo-starter/server/src/lib/dto/security-setting.dto.ts +0 -21
  339. package/templates/monorepo-starter/server/src/lib/pipes/validation.pipe.ts +0 -7
  340. package/templates/monorepo-starter/server/src/lib/templates/notification.templates.ts +0 -243
  341. package/templates/monorepo-starter/server/src/lib/utils/general.util.ts +0 -24
  342. package/templates/monorepo-starter/server/src/modules/auth/role.service.ts +0 -99
  343. package/templates/monorepo-starter/server/src/modules/auth/security-setting.service.ts +0 -102
  344. package/templates/monorepo-starter/server/src/modules/template/template.module.ts +0 -8
  345. package/templates/monorepo-starter/server/src/modules/template/template.service.ts +0 -33
  346. package/templates/monorepo-starter/server/src/types/index.d.ts +0 -13
  347. package/templates/monorepo-starter/server/test/app.e2e-spec.ts +0 -25
  348. package/templates/monorepo-starter/server/test/jest-e2e.json +0 -9
  349. /package/templates/monorepo-starter/{packages/ui/src/hooks → apps/dashboard/public}/.gitkeep +0 -0
@@ -1,17 +1,4 @@
1
1
  packages:
2
- - "apps/*"
3
- - "packages/*"
4
- - "server"
5
-
6
- onlyBuiltDependencies:
7
- - "@nestjs/core"
8
- - "@swc/core"
9
- - "@tailwindcss/oxide"
10
- - "core-js-pure"
11
- - "esbuild"
12
- - "sharp"
13
- - "unrs-resolver"
14
- - "@prisma/client"
15
- - "@prisma/engines"
16
- - "prisma"
17
- - argon2
2
+ - apps/*
3
+ - packages/*
4
+ - server
@@ -13,7 +13,7 @@ ADMIN_ENDPOINT="http://localhost:3001"
13
13
  # Database
14
14
  # ==============================
15
15
  # example "postgresql://DB_USER:DB_PASSWORD@DB_HOST:DB_PORT/DB_NAME"
16
- DB_URI="postgresql://postgres:47425@localhost:5432/your-proj"
16
+ DB_URI="postgresql://postgres:47425@localhost:5432/owits-agency"
17
17
 
18
18
  # ==============================
19
19
  # OTP
@@ -47,9 +47,12 @@ TWILIO_AUTH_TOKEN="your-twilio-auth-token"
47
47
  TWILIO_PHONE_NUMBER="+1234567890"
48
48
 
49
49
  # ==============================
50
- # Email (Resend)
50
+ # Email (Nodemailer)
51
51
  # ==============================
52
- RESEND_API_KEY="your-resend-api-key"
52
+ SMTP_HOST='your-smtp-host'
53
+ SMTP_PORT='your-smtp-port'
54
+ SMTP_USER='your-smtp-user'
55
+ SMTP_PASS='your-smtp-pass'
53
56
 
54
57
  # ==============================
55
58
  # API Keys
@@ -59,7 +62,6 @@ IP_STACK_API_KEY="your-ipstack-api-key"
59
62
  # ==============================
60
63
  # Admin
61
64
  # ==============================
65
+ ADMIN_NAME="Admin User"
62
66
  ADMIN_EMAIL="admin@example.com"
63
67
  ADMIN_PASSWORD="super-secret-password"
64
- ADMIN_NAME="Admin User"
65
- ADMIN_PHONE="+1234567890"
@@ -1,4 +1 @@
1
- import { config } from '@workspace/config/eslint/nest';
2
-
3
- /** @type {import("eslint").Linter.Config} */
4
- export default config;
1
+ export { default } from "@workspace/config/eslint/node";
@@ -1,97 +1,129 @@
1
- {
2
- "name": "server",
3
- "version": "0.0.1",
4
- "type": "module",
5
- "private": true,
6
- "license": "UNLICENSED",
7
- "scripts": {
8
- "dev": "tsup src/main.ts --watch",
9
- "build": "tsup",
10
- "start": "node dist/main.js",
11
- "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
12
- "format": "prettier --write \"{src,apps,libs,test}/**/*.ts\"",
13
- "prisma:generate": "prisma generate",
14
- "prisma:migrate:dev": "prisma migrate dev --name init",
15
- "prisma:migrate:prod": "prisma migrate deploy --name init",
16
- "prisma:studio": "prisma studio",
17
- "prisma:validate": "prisma validate",
18
- "prisma:reset": "prisma migrate reset",
19
- "generate:module": "bash ./scripts/nest-gen.sh",
20
- "test": "jest",
21
- "test:watch": "jest --watch",
22
- "test:cov": "jest --coverage",
23
- "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
24
- "test:e2e": "jest --config ./test/jest-e2e.json"
25
- },
26
- "dependencies": {
27
- "@nestjs/common": "^11.1.9",
28
- "@nestjs/config": "^4.0.2",
29
- "@nestjs/core": "^11.1.9",
30
- "@nestjs/jwt": "^11.0.2",
31
- "@nestjs/passport": "^11.0.5",
32
- "@nestjs/platform-express": "^11.1.9",
33
- "@nestjs/schedule": "^6.1.0",
34
- "@prisma/adapter-pg": "^7.2.0",
35
- "@prisma/client": "^7.2.0",
36
- "argon2": "^0.44.0",
37
- "class-transformer": "^0.5.1",
38
- "class-validator": "^0.14.3",
39
- "cookie-parser": "^1.4.7",
40
- "ms": "^2.1.3",
41
- "nest-winston": "^1.10.2",
42
- "passport": "^0.7.0",
43
- "passport-facebook": "^3.0.0",
44
- "passport-google-oauth20": "^2.0.0",
45
- "pg": "^8.16.3",
46
- "reflect-metadata": "^0.2.2",
47
- "resend": "^6.6.0",
48
- "rxjs": "^7.8.2",
49
- "winston": "^3.19.0",
50
- "winston-daily-rotate-file": "^5.0.0",
51
- "zod": "^4.2.1"
52
- },
53
- "devDependencies": {
54
- "@nestjs/cli": "^11.0.14",
55
- "@nestjs/schematics": "^11.0.9",
56
- "@nestjs/testing": "^11.1.9",
57
- "@swc/cli": "^0.7.9",
58
- "@swc/core": "^1.15.7",
59
- "@types/cookie-parser": "^1.4.10",
60
- "@types/express": "^5.0.6",
61
- "@types/jest": "^30.0.0",
62
- "@types/ms": "^2.1.0",
63
- "@types/node": "^25.0.3",
64
- "@types/passport": "^1.0.17",
65
- "@types/passport-facebook": "^3.0.4",
66
- "@types/passport-google-oauth20": "^2.0.17",
67
- "@types/pg": "^8.16.0",
68
- "@types/supertest": "^6.0.3",
69
- "@workspace/config": "workspace:^",
70
- "jest": "^30.2.0",
71
- "prisma": "^7.2.0",
72
- "source-map-support": "^0.5.21",
73
- "supertest": "^7.1.4",
74
- "ts-jest": "^29.4.6",
75
- "ts-loader": "^9.5.4",
76
- "ts-node": "^10.9.2",
77
- "tsconfig-paths": "^4.2.0",
78
- "tsup": "^8.5.1"
79
- },
80
- "jest": {
81
- "moduleFileExtensions": [
82
- "js",
83
- "json",
84
- "ts"
85
- ],
86
- "rootDir": "src",
87
- "testRegex": ".*\\.spec\\.ts$",
88
- "transform": {
89
- "^.+\\.(t|j)s$": "ts-jest"
90
- },
91
- "collectCoverageFrom": [
92
- "**/*.(t|j)s"
93
- ],
94
- "coverageDirectory": "../coverage",
95
- "testEnvironment": "node"
96
- }
97
- }
1
+ {
2
+ "name": "server",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "private": true,
6
+ "license": "UNLICENSED",
7
+ "scripts": {
8
+ "dev": "tsup src/main.ts --watch",
9
+ "start": "node dist/main.js",
10
+ "build": "tsup",
11
+ "lint": "eslint",
12
+ "check-types": "tsc --noEmit",
13
+ "format": "prettier --write \"{src,apps,libs,test}/**/*.ts\"",
14
+ "generate:module": "bash ./scripts/gen-module.sh",
15
+ "prisma:generate": "prisma generate && tsx ./scripts/gen-soft-delete",
16
+ "prisma:migrate:dev": "prisma migrate dev",
17
+ "prisma:migrate:prod": "dotenv -e .env.prod -- prisma migrate deploy",
18
+ "prisma:studio": "prisma studio",
19
+ "prisma:validate": "prisma validate",
20
+ "prisma:reset": "prisma migrate reset",
21
+ "prisma:seed": "prisma db seed",
22
+ "prisma:setup:dev": "prisma migrate dev && pnpm prisma:generate",
23
+ "admin:bootstrap:dev": "dotenv -e .env -- tsx scripts/admin-bootstrap.ts",
24
+ "admin:bootstrap:prod": "dotenv -e .env.prod -- tsx scripts/admin-bootstrap.ts",
25
+ "test": "jest",
26
+ "test:watch": "jest --watch",
27
+ "test:cov": "jest --coverage",
28
+ "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
29
+ "test:e2e": "jest --config ./test/jest-e2e.json"
30
+ },
31
+ "dependencies": {
32
+ "@keyv/redis": "^5.1.6",
33
+ "@nestjs/cache-manager": "^3.1.0",
34
+ "@nestjs/common": "^11.1.16",
35
+ "@nestjs/config": "^4.0.3",
36
+ "@nestjs/core": "^11.1.16",
37
+ "@nestjs/passport": "^11.0.5",
38
+ "@nestjs/platform-express": "^11.1.16",
39
+ "@nestjs/schedule": "^6.1.1",
40
+ "@prisma/adapter-pg": "^7.4.2",
41
+ "@prisma/client": "^7.4.2",
42
+ "argon2": "^0.44.0",
43
+ "axios": "^1.13.6",
44
+ "cache-manager": "^7.2.8",
45
+ "cloudinary": "^2.9.0",
46
+ "cookie-parser": "^1.4.7",
47
+ "dotenv": "^17.3.1",
48
+ "firebase-admin": "^13.7.0",
49
+ "jose": "^6.2.0",
50
+ "lodash": "^4.17.23",
51
+ "ms": "^2.1.3",
52
+ "nest-winston": "^1.10.2",
53
+ "nestjs-zod": "^5.1.1",
54
+ "nodemailer": "^8.0.1",
55
+ "passport": "^0.7.0",
56
+ "passport-facebook": "^3.0.0",
57
+ "passport-google-oauth20": "^2.0.0",
58
+ "pg": "^8.20.0",
59
+ "reflect-metadata": "^0.2.2",
60
+ "rxjs": "^7.8.2",
61
+ "streamifier": "^0.1.1",
62
+ "twilio": "^5.12.2",
63
+ "ua-parser-js": "^2.0.9",
64
+ "ulid": "^3.0.2",
65
+ "winston": "^3.19.0",
66
+ "winston-daily-rotate-file": "^5.0.0",
67
+ "zod": "^4.3.6"
68
+ },
69
+ "devDependencies": {
70
+ "@eslint/js": "^9.39.3",
71
+ "@nestjs/cli": "^11.0.16",
72
+ "@nestjs/schematics": "^11.0.9",
73
+ "@nestjs/testing": "^11.1.16",
74
+ "@swc/cli": "^0.7.10",
75
+ "@swc/core": "^1.15.18",
76
+ "@types/cookie-parser": "^1.4.10",
77
+ "@types/express": "^5.0.6",
78
+ "@types/jest": "^30.0.0",
79
+ "@types/lodash": "^4.17.24",
80
+ "@types/ms": "^2.1.0",
81
+ "@types/multer": "^2.0.0",
82
+ "@types/node": "^25.3.5",
83
+ "@types/nodemailer": "^7.0.11",
84
+ "@types/passport": "^1.0.17",
85
+ "@types/passport-facebook": "^3.0.4",
86
+ "@types/passport-google-oauth20": "^2.0.17",
87
+ "@types/pg": "^8.18.0",
88
+ "@types/streamifier": "^0.1.2",
89
+ "@types/supertest": "^6.0.3",
90
+ "@workspace/config": "workspace:*",
91
+ "@workspace/contracts": "workspace:*",
92
+ "@workspace/shared": "workspace:*",
93
+ "@workspace/templates": "workspace:*",
94
+ "dotenv-cli": "^11.0.0",
95
+ "eslint": "^9.39.3",
96
+ "eslint-plugin-react": "^7.37.5",
97
+ "eslint-plugin-react-hooks": "^7.0.1",
98
+ "eslint-plugin-turbo": "^2.8.13",
99
+ "globals": "^17.4.0",
100
+ "jest": "^30.2.0",
101
+ "prisma": "^7.4.2",
102
+ "source-map-support": "^0.5.21",
103
+ "supertest": "^7.2.2",
104
+ "ts-jest": "^29.4.6",
105
+ "ts-loader": "^9.5.4",
106
+ "ts-node": "^10.9.2",
107
+ "tsconfig-paths": "^4.2.0",
108
+ "tsup": "^8.5.1",
109
+ "tsx": "^4.21.0",
110
+ "typescript-eslint": "^8.56.1"
111
+ },
112
+ "jest": {
113
+ "moduleFileExtensions": [
114
+ "js",
115
+ "json",
116
+ "ts"
117
+ ],
118
+ "rootDir": "src",
119
+ "testRegex": ".*\\.spec\\.ts$",
120
+ "transform": {
121
+ "^.+\\.(t|j)s$": "ts-jest"
122
+ },
123
+ "collectCoverageFrom": [
124
+ "**/*.(t|j)s"
125
+ ],
126
+ "coverageDirectory": "../coverage",
127
+ "testEnvironment": "node"
128
+ }
129
+ }
@@ -1,5 +1,3 @@
1
- // prisma/schema.prisma
2
-
3
1
  generator client {
4
2
  provider = "prisma-client"
5
3
  output = "./generated"
@@ -13,24 +11,36 @@ datasource db {
13
11
  // ENUMS
14
12
  //
15
13
 
14
+ enum ThemeMode {
15
+ light
16
+ dark
17
+ system
18
+ }
19
+
16
20
  enum UserRole {
17
21
  admin
18
22
  customer
19
23
  }
20
24
 
25
+ enum UserStatus {
26
+ pending
27
+ active
28
+ suspended
29
+ }
30
+
21
31
  enum OtpPurpose {
22
- setPassword
23
- resetPassword
24
- verifyIdentifier
25
- changeIdentifier
26
- enableMfa
27
- disableMfa
28
- verifyMfa
32
+ authSetPassword
33
+ authResetPassword
34
+ authVerifyIdentifier
35
+ authUpdateIdentifier
36
+ authUpdateMfa
37
+ authDisableMfa
38
+ authVerifyMfa
29
39
  }
30
40
 
31
41
  enum OtpType {
32
- otp
33
- token
42
+ numericCode
43
+ secureToken
34
44
  }
35
45
 
36
46
  enum MfaMethod {
@@ -40,18 +50,65 @@ enum MfaMethod {
40
50
  authApp
41
51
  }
42
52
 
43
- enum NotificationType {
53
+ enum SessionStatus {
54
+ active
55
+ revoked
56
+ expired
57
+ }
58
+
59
+ enum NotificationChannel {
60
+ push
44
61
  email
45
62
  sms
46
63
  whatsapp
47
- inApp
64
+ }
65
+
66
+ enum MessagingChannel {
67
+ sms
68
+ whatsapp
69
+ }
70
+
71
+ enum PushProvider {
72
+ fcm
73
+ expo
74
+ }
75
+
76
+ enum NotificationPurpose {
77
+ authSignUp
78
+ authSignIn
79
+ authSetPassword
80
+ authResetPassword
81
+ authVerifyIdentifier
82
+ authUpdateIdentifier
83
+ authUpdateMfa
84
+ authDisableMfa
85
+ authVerifyMfa
86
+
87
+ accountSuspended
88
+ accountReactivated
89
+ }
90
+
91
+ enum NotificationPriority {
92
+ normal
93
+ important
48
94
  }
49
95
 
50
96
  enum NotificationStatus {
51
97
  pending
98
+ partial
52
99
  sent
53
100
  failed
54
- read
101
+ }
102
+
103
+ enum MediaVisibility {
104
+ private
105
+ public
106
+ }
107
+
108
+ enum MediaType {
109
+ photo
110
+ logo
111
+ other
55
112
  }
56
113
 
57
114
  //
@@ -59,102 +116,85 @@ enum NotificationStatus {
59
116
  //
60
117
 
61
118
  model User {
119
+ // Core fields
62
120
  id String @id @default(ulid())
63
- username String? @unique
64
- password String?
65
121
  firstName String
66
122
  lastName String?
67
123
  displayName String
68
- imageUrl String?
124
+ password String? @db.VarChar(255)
125
+
126
+ imageId String?
127
+ image Media? @relation("UserImage", fields: [imageId], references: [id])
69
128
 
70
- // Contact
71
- email String? @unique
72
- phone String? @unique
129
+ // Contact info
130
+ email String? @unique @db.VarChar(255)
131
+ phone String? @unique @db.VarChar(20)
73
132
  isEmailVerified Boolean @default(false)
74
133
  isPhoneVerified Boolean @default(false)
75
134
 
76
- // Status
135
+ role UserRole
136
+ status UserStatus @default(pending)
137
+
138
+ preferredTheme ThemeMode @default(system)
139
+ pushNotifications Boolean @default(false)
140
+
141
+ preferredMfa MfaMethod?
142
+ fallbackChannel MessagingChannel @default(sms)
143
+
144
+ loginAlerts Boolean @default(true)
77
145
  lastLoginAt DateTime?
78
146
 
147
+ // Meta
79
148
  createdAt DateTime @default(now())
80
149
  updatedAt DateTime @updatedAt
81
150
  deletedAt DateTime?
82
151
 
83
152
  // Relations
84
- refreshTokens RefreshToken[]
85
- otps Otp[]
86
- roles RoleAssignment[]
87
- securitySetting SecuritySetting?
88
-
153
+ otps Otp[]
154
+ sessions Session[]
89
155
  notifications Notification[]
90
- backupCodes BackupCode[]
156
+ medias Media[] @relation("UserUploads")
91
157
 
92
- @@index([email])
93
- @@index([phone])
94
- @@index([username])
158
+ // Indexes
159
+ @@index([status])
160
+ @@index([role])
95
161
  @@index([email, isEmailVerified])
96
162
  @@index([phone, isPhoneVerified])
163
+ @@index([deletedAt])
97
164
  }
98
165
 
99
- model RoleAssignment {
100
- id String @id @default(ulid())
166
+ model Session {
167
+ id String @id @default(ulid())
168
+
101
169
  userId String
102
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
103
- role UserRole
170
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
104
171
 
105
- createdAt DateTime @default(now())
106
- updatedAt DateTime @updatedAt
107
- revokedAt DateTime?
172
+ refreshTokenHash String
173
+ status SessionStatus @default(active)
108
174
 
109
- @@unique([userId, role])
110
- }
175
+ ip String
176
+ location String
177
+ isp String?
178
+ timezone String
111
179
 
112
- model SecuritySetting {
113
- id String @id @default(ulid())
114
- userId String @unique
115
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
116
-
117
- preferredMfa MfaMethod?
118
- recoveryEmail String?
119
- recoveryPhone String?
120
- isMfaEnabled Boolean @default(false)
121
- loginAlerts Boolean @default(true)
180
+ deviceId String
181
+ deviceType String
182
+ deviceInfo String
122
183
 
123
- createdAt DateTime @default(now())
124
- updatedAt DateTime @updatedAt
184
+ isTrusted Boolean @default(false)
185
+ lastSeenAt DateTime?
125
186
 
126
- @@index([userId])
127
- @@index([isMfaEnabled])
128
- }
187
+ pushProvider PushProvider?
188
+ pushToken String?
129
189
 
130
- model BackupCode {
131
- id String @id @default(ulid())
132
- userId String
133
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
134
- code String @unique
135
- usedAt DateTime?
136
190
  createdAt DateTime @default(now())
137
191
  expiresAt DateTime
192
+ revokedAt DateTime?
138
193
 
139
- @@index([userId, usedAt])
140
- }
141
-
142
- model RefreshToken {
143
- id String @id @default(ulid())
144
- token String @unique
145
- userId String
146
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
147
- ip String
148
- userAgent String
149
- lastUsed DateTime @default(now())
150
- createdAt DateTime @default(now())
151
- expiresAt DateTime
152
- isActive Boolean @default(true)
153
- blacklisted Boolean @default(false)
154
-
155
- @@index([userId])
194
+ @@unique([userId, deviceId])
156
195
  @@index([expiresAt])
157
- @@index([userId, expiresAt])
196
+ @@index([userId, status])
197
+ @@index([expiresAt, status])
158
198
  }
159
199
 
160
200
  model Otp {
@@ -162,8 +202,9 @@ model Otp {
162
202
  userId String
163
203
  user User @relation(fields: [userId], references: [id], onDelete: Cascade)
164
204
  purpose OtpPurpose
165
- type OtpType @default(otp)
205
+ type OtpType @default(numericCode)
166
206
  secret String
207
+ meta Json?
167
208
  expiresAt DateTime
168
209
  usedAt DateTime?
169
210
  createdAt DateTime @default(now())
@@ -174,20 +215,57 @@ model Otp {
174
215
  }
175
216
 
176
217
  model Notification {
177
- id String @id @default(cuid())
178
- userId String
179
- user User @relation(fields: [userId], references: [id], onDelete: Cascade)
180
- type NotificationType
181
- title String?
182
- message String?
183
- purpose String
184
- metadata Json?
185
- status NotificationStatus @default(pending)
186
- sentAt DateTime?
218
+ id String @id @default(ulid())
219
+ userId String
220
+ user User @relation(fields: [userId], references: [id], onDelete: Cascade)
221
+
222
+ purpose NotificationPurpose
223
+ channels NotificationChannel[]
224
+ priority NotificationPriority @default(normal)
225
+
226
+ subject String
227
+ message String
228
+ recipient String
229
+ meta Json?
230
+
231
+ status NotificationStatus @default(pending)
232
+
187
233
  readAt DateTime?
188
- createdAt DateTime @default(now())
189
- updatedAt DateTime @updatedAt
234
+ createdAt DateTime @default(now())
235
+ updatedAt DateTime @updatedAt
190
236
 
191
237
  @@index([userId])
192
- @@index([userId, readAt])
238
+ @@index([status, createdAt])
239
+ }
240
+
241
+ model Media {
242
+ id String @id @default(ulid())
243
+
244
+ uploadedById String
245
+ uploadedBy User @relation("UserUploads", fields: [uploadedById], references: [id])
246
+
247
+ url String @unique
248
+ filename String
249
+ mimeType String
250
+ size Int
251
+ hash String @unique
252
+
253
+ title String
254
+ altText String?
255
+ type MediaType
256
+ visibility MediaVisibility @default(private)
257
+
258
+ notes String?
259
+
260
+ createdAt DateTime @default(now())
261
+ updatedAt DateTime @updatedAt
262
+ deletedAt DateTime?
263
+
264
+ users User[] @relation("UserImage")
265
+
266
+ @@index([type])
267
+ @@index([filename])
268
+ @@index([uploadedById])
269
+ @@index([createdAt])
270
+ @@index([deletedAt])
193
271
  }
@@ -1,13 +1,13 @@
1
- import 'dotenv/config'
1
+ import "dotenv/config";
2
2
  import { defineConfig, env } from "prisma/config";
3
3
 
4
4
  export default defineConfig({
5
- schema: 'prisma/schema.prisma',
6
- migrations: {
7
- path: 'prisma/migrations',
8
- seed: 'tsx prisma/seed.ts',
5
+ schema: "prisma/schema.prisma",
6
+ migrations: {
7
+ path: "prisma/migrations",
8
+ seed: "tsx prisma/seed.ts",
9
9
  },
10
- datasource: {
11
- url: env("DB_URI")
12
- }
13
- });
10
+ datasource: {
11
+ url: env("DB_URI"),
12
+ },
13
+ });