@lenne.tech/nest-server 11.13.4 → 11.14.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 (332) hide show
  1. package/README.md +1 -3
  2. package/dist/core/common/args/filter.args.js +3 -6
  3. package/dist/core/common/args/filter.args.js.map +1 -1
  4. package/dist/core/common/args/pagination.args.js +6 -9
  5. package/dist/core/common/args/pagination.args.js.map +1 -1
  6. package/dist/core/common/decorators/translatable.decorator.js +1 -1
  7. package/dist/core/common/decorators/translatable.decorator.js.map +1 -1
  8. package/dist/core/common/enums/role.enum.js.map +1 -1
  9. package/dist/core/common/filters/http-exception-log.filter.js +3 -1
  10. package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
  11. package/dist/core/common/helpers/config.helper.js +2 -2
  12. package/dist/core/common/helpers/config.helper.js.map +1 -1
  13. package/dist/core/common/helpers/db.helper.js +12 -12
  14. package/dist/core/common/helpers/db.helper.js.map +1 -1
  15. package/dist/core/common/helpers/graphql.helper.js +1 -1
  16. package/dist/core/common/helpers/graphql.helper.js.map +1 -1
  17. package/dist/core/common/helpers/input.helper.js +7 -4
  18. package/dist/core/common/helpers/input.helper.js.map +1 -1
  19. package/dist/core/common/helpers/scim.helper.js +2 -2
  20. package/dist/core/common/helpers/scim.helper.js.map +1 -1
  21. package/dist/core/common/helpers/service.helper.js +1 -1
  22. package/dist/core/common/helpers/service.helper.js.map +1 -1
  23. package/dist/core/common/inputs/combined-filter.input.js +3 -6
  24. package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
  25. package/dist/core/common/inputs/core-input.input.js +1 -1
  26. package/dist/core/common/inputs/core-input.input.js.map +1 -1
  27. package/dist/core/common/inputs/filter.input.js +3 -6
  28. package/dist/core/common/inputs/filter.input.js.map +1 -1
  29. package/dist/core/common/inputs/single-filter.input.js +9 -12
  30. package/dist/core/common/inputs/single-filter.input.js.map +1 -1
  31. package/dist/core/common/inputs/sort.input.js +2 -5
  32. package/dist/core/common/inputs/sort.input.js.map +1 -1
  33. package/dist/core/common/interceptors/check-response.interceptor.js +12 -11
  34. package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
  35. package/dist/core/common/interceptors/check-security.interceptor.js +5 -4
  36. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  37. package/dist/core/common/interfaces/server-options.interface.d.ts +10 -0
  38. package/dist/core/common/models/core-model.model.d.ts +2 -2
  39. package/dist/core/common/models/core-model.model.js +2 -2
  40. package/dist/core/common/models/core-model.model.js.map +1 -1
  41. package/dist/core/common/models/core-persistence.model.js +3 -6
  42. package/dist/core/common/models/core-persistence.model.js.map +1 -1
  43. package/dist/core/common/models/pagination-info.model.js +6 -0
  44. package/dist/core/common/models/pagination-info.model.js.map +1 -1
  45. package/dist/core/common/pipes/check-input.pipe.js +1 -0
  46. package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
  47. package/dist/core/common/plugins/complexity.plugin.js +2 -0
  48. package/dist/core/common/plugins/complexity.plugin.js.map +1 -1
  49. package/dist/core/common/scalars/any.scalar.js +2 -4
  50. package/dist/core/common/scalars/any.scalar.js.map +1 -1
  51. package/dist/core/common/scalars/date-timestamp.scalar.js +1 -3
  52. package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
  53. package/dist/core/common/scalars/date.scalar.js +1 -3
  54. package/dist/core/common/scalars/date.scalar.js.map +1 -1
  55. package/dist/core/common/scalars/json.scalar.js +2 -4
  56. package/dist/core/common/scalars/json.scalar.js.map +1 -1
  57. package/dist/core/common/services/brevo.service.js +3 -0
  58. package/dist/core/common/services/brevo.service.js.map +1 -1
  59. package/dist/core/common/services/config.service.js +15 -8
  60. package/dist/core/common/services/config.service.js.map +1 -1
  61. package/dist/core/common/services/core-cron-jobs.service.js +10 -7
  62. package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
  63. package/dist/core/common/services/crud.service.js +1 -9
  64. package/dist/core/common/services/crud.service.js.map +1 -1
  65. package/dist/core/common/services/email.service.js +2 -0
  66. package/dist/core/common/services/email.service.js.map +1 -1
  67. package/dist/core/common/services/mailjet.service.js +5 -4
  68. package/dist/core/common/services/mailjet.service.js.map +1 -1
  69. package/dist/core/common/services/model-doc.service.js +1 -0
  70. package/dist/core/common/services/model-doc.service.js.map +1 -1
  71. package/dist/core/common/services/module.service.js +6 -3
  72. package/dist/core/common/services/module.service.js.map +1 -1
  73. package/dist/core/common/services/template.service.js +2 -1
  74. package/dist/core/common/services/template.service.js.map +1 -1
  75. package/dist/core/common/types/array-element.type.d.ts +1 -1
  76. package/dist/core/modules/auth/core-auth.controller.js +2 -0
  77. package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
  78. package/dist/core/modules/auth/core-auth.model.js +3 -6
  79. package/dist/core/modules/auth/core-auth.model.js.map +1 -1
  80. package/dist/core/modules/auth/core-auth.resolver.js +2 -0
  81. package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
  82. package/dist/core/modules/auth/guards/auth.guard.js +6 -4
  83. package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
  84. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -0
  85. package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
  86. package/dist/core/modules/auth/guards/roles-guard-registry.js +3 -3
  87. package/dist/core/modules/auth/guards/roles-guard-registry.js.map +1 -1
  88. package/dist/core/modules/auth/guards/roles.guard.js +15 -7
  89. package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
  90. package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +4 -7
  91. package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js.map +1 -1
  92. package/dist/core/modules/auth/services/core-auth.service.js +6 -1
  93. package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
  94. package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js +4 -4
  95. package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js.map +1 -1
  96. package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js +2 -0
  97. package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js.map +1 -1
  98. package/dist/core/modules/auth/strategies/jwt.strategy.js +2 -0
  99. package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
  100. package/dist/core/modules/auth/tokens.decorator.js +2 -2
  101. package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
  102. package/dist/core/modules/better-auth/better-auth-roles.guard.js +2 -4
  103. package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
  104. package/dist/core/modules/better-auth/better-auth-token.service.js +3 -1
  105. package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
  106. package/dist/core/modules/better-auth/better-auth.resolver.js +4 -0
  107. package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -1
  108. package/dist/core/modules/better-auth/better-auth.types.js.map +1 -1
  109. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -3
  110. package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
  111. package/dist/core/modules/better-auth/core-better-auth-auth.model.js +7 -0
  112. package/dist/core/modules/better-auth/core-better-auth-auth.model.js.map +1 -1
  113. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +6 -4
  114. package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
  115. package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js +3 -0
  116. package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js.map +1 -1
  117. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +13 -8
  118. package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
  119. package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js +8 -0
  120. package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js.map +1 -1
  121. package/dist/core/modules/better-auth/core-better-auth-models.js +31 -0
  122. package/dist/core/modules/better-auth/core-better-auth-models.js.map +1 -1
  123. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -0
  124. package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
  125. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +4 -4
  126. package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
  127. package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js +3 -2
  128. package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js.map +1 -1
  129. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +2 -1
  130. package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
  131. package/dist/core/modules/better-auth/core-better-auth.controller.js +27 -1
  132. package/dist/core/modules/better-auth/core-better-auth.controller.js.map +1 -1
  133. package/dist/core/modules/better-auth/core-better-auth.middleware.js +3 -1
  134. package/dist/core/modules/better-auth/core-better-auth.middleware.js.map +1 -1
  135. package/dist/core/modules/better-auth/core-better-auth.module.js +23 -18
  136. package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
  137. package/dist/core/modules/better-auth/core-better-auth.resolver.js +5 -1
  138. package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -1
  139. package/dist/core/modules/better-auth/core-better-auth.service.js +6 -1
  140. package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
  141. package/dist/core/modules/error-code/core-error-code.controller.js +1 -0
  142. package/dist/core/modules/error-code/core-error-code.controller.js.map +1 -1
  143. package/dist/core/modules/error-code/core-error-code.service.js +3 -3
  144. package/dist/core/modules/error-code/core-error-code.service.js.map +1 -1
  145. package/dist/core/modules/error-code/error-codes.d.ts +27 -0
  146. package/dist/core/modules/error-code/error-codes.js +24 -0
  147. package/dist/core/modules/error-code/error-codes.js.map +1 -1
  148. package/dist/core/modules/file/core-file-info.model.js +6 -9
  149. package/dist/core/modules/file/core-file-info.model.js.map +1 -1
  150. package/dist/core/modules/file/core-file.controller.js +1 -0
  151. package/dist/core/modules/file/core-file.controller.js.map +1 -1
  152. package/dist/core/modules/file/core-file.resolver.js +1 -0
  153. package/dist/core/modules/file/core-file.resolver.js.map +1 -1
  154. package/dist/core/modules/file/core-file.service.d.ts +1 -1
  155. package/dist/core/modules/file/core-file.service.js +4 -4
  156. package/dist/core/modules/file/core-file.service.js.map +1 -1
  157. package/dist/core/modules/health-check/core-health-check-result.model.js +4 -7
  158. package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -1
  159. package/dist/core/modules/health-check/core-health-check.controller.js +1 -0
  160. package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
  161. package/dist/core/modules/health-check/core-health-check.resolver.js +1 -0
  162. package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -1
  163. package/dist/core/modules/health-check/core-health-check.service.js +5 -0
  164. package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
  165. package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
  166. package/dist/core/modules/migrate/helpers/migration.helper.js +11 -19
  167. package/dist/core/modules/migrate/helpers/migration.helper.js.map +1 -1
  168. package/dist/core/modules/migrate/migration-runner.js +2 -0
  169. package/dist/core/modules/migrate/migration-runner.js.map +1 -1
  170. package/dist/core/modules/migrate/mongo-state-store.js +3 -0
  171. package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
  172. package/dist/core/modules/system-setup/core-system-setup.controller.d.ts +12 -0
  173. package/dist/core/modules/system-setup/core-system-setup.controller.js +90 -0
  174. package/dist/core/modules/system-setup/core-system-setup.controller.js.map +1 -0
  175. package/dist/core/modules/system-setup/core-system-setup.module.d.ts +2 -0
  176. package/dist/core/modules/system-setup/core-system-setup.module.js +22 -0
  177. package/dist/core/modules/system-setup/core-system-setup.module.js.map +1 -0
  178. package/dist/core/modules/system-setup/core-system-setup.service.d.ts +30 -0
  179. package/dist/core/modules/system-setup/core-system-setup.service.js +158 -0
  180. package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -0
  181. package/dist/core/modules/tus/core-tus.controller.js +2 -1
  182. package/dist/core/modules/tus/core-tus.controller.js.map +1 -1
  183. package/dist/core/modules/tus/core-tus.service.js +6 -3
  184. package/dist/core/modules/tus/core-tus.service.js.map +1 -1
  185. package/dist/core/modules/tus/tus.module.js +7 -5
  186. package/dist/core/modules/tus/tus.module.js.map +1 -1
  187. package/dist/core/modules/user/core-user.model.js +15 -18
  188. package/dist/core/modules/user/core-user.model.js.map +1 -1
  189. package/dist/core/modules/user/core-user.service.d.ts +1 -1
  190. package/dist/core/modules/user/core-user.service.js +7 -2
  191. package/dist/core/modules/user/core-user.service.js.map +1 -1
  192. package/dist/core/modules/user/inputs/core-user-create.input.js +1 -4
  193. package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
  194. package/dist/core/modules/user/inputs/core-user.input.js +6 -9
  195. package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
  196. package/dist/core.module.js +9 -9
  197. package/dist/core.module.js.map +1 -1
  198. package/dist/index.d.ts +3 -0
  199. package/dist/index.js +3 -0
  200. package/dist/index.js.map +1 -1
  201. package/dist/server/common/models/persistence.model.js +2 -5
  202. package/dist/server/common/models/persistence.model.js.map +1 -1
  203. package/dist/server/common/services/cron-jobs.service.js +2 -0
  204. package/dist/server/common/services/cron-jobs.service.js.map +1 -1
  205. package/dist/server/modules/auth/auth.controller.js +2 -0
  206. package/dist/server/modules/auth/auth.controller.js.map +1 -1
  207. package/dist/server/modules/auth/auth.model.js +1 -4
  208. package/dist/server/modules/auth/auth.model.js.map +1 -1
  209. package/dist/server/modules/auth/auth.module.js +1 -6
  210. package/dist/server/modules/auth/auth.module.js.map +1 -1
  211. package/dist/server/modules/auth/auth.resolver.js +2 -0
  212. package/dist/server/modules/auth/auth.resolver.js.map +1 -1
  213. package/dist/server/modules/auth/auth.service.js +4 -0
  214. package/dist/server/modules/auth/auth.service.js.map +1 -1
  215. package/dist/server/modules/auth/inputs/auth-sign-up.input.js +2 -5
  216. package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
  217. package/dist/server/modules/better-auth/better-auth.controller.js +3 -0
  218. package/dist/server/modules/better-auth/better-auth.controller.js.map +1 -1
  219. package/dist/server/modules/better-auth/better-auth.resolver.js +4 -0
  220. package/dist/server/modules/better-auth/better-auth.resolver.js.map +1 -1
  221. package/dist/server/modules/error-code/error-code.controller.js +1 -0
  222. package/dist/server/modules/error-code/error-code.controller.js.map +1 -1
  223. package/dist/server/modules/error-code/error-codes.d.ts +3 -0
  224. package/dist/server/modules/file/file-info.model.d.ts +2 -2
  225. package/dist/server/modules/file/file.controller.js +1 -0
  226. package/dist/server/modules/file/file.controller.js.map +1 -1
  227. package/dist/server/modules/file/file.resolver.js +2 -1
  228. package/dist/server/modules/file/file.resolver.js.map +1 -1
  229. package/dist/server/modules/file/file.service.js +2 -3
  230. package/dist/server/modules/file/file.service.js.map +1 -1
  231. package/dist/server/modules/user/avatar.controller.js +1 -0
  232. package/dist/server/modules/user/avatar.controller.js.map +1 -1
  233. package/dist/server/modules/user/inputs/user-create.input.js +1 -4
  234. package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
  235. package/dist/server/modules/user/inputs/user.input.js +1 -4
  236. package/dist/server/modules/user/inputs/user.input.js.map +1 -1
  237. package/dist/server/modules/user/outputs/find-and-count-users-result.output.js +3 -0
  238. package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
  239. package/dist/server/modules/user/user.controller.js +1 -0
  240. package/dist/server/modules/user/user.controller.js.map +1 -1
  241. package/dist/server/modules/user/user.model.js +7 -10
  242. package/dist/server/modules/user/user.model.js.map +1 -1
  243. package/dist/server/modules/user/user.resolver.js +3 -1
  244. package/dist/server/modules/user/user.resolver.js.map +1 -1
  245. package/dist/server/modules/user/user.service.js +6 -0
  246. package/dist/server/modules/user/user.service.js.map +1 -1
  247. package/dist/server/server.controller.js +1 -0
  248. package/dist/server/server.controller.js.map +1 -1
  249. package/dist/test/test.helper.js +18 -10
  250. package/dist/test/test.helper.js.map +1 -1
  251. package/dist/tsconfig.build.tsbuildinfo +1 -1
  252. package/package.json +26 -58
  253. package/src/core/common/args/filter.args.ts +1 -1
  254. package/src/core/common/args/pagination.args.ts +1 -1
  255. package/src/core/common/decorators/translatable.decorator.ts +1 -1
  256. package/src/core/common/enums/role.enum.ts +0 -1
  257. package/src/core/common/filters/http-exception-log.filter.ts +3 -3
  258. package/src/core/common/helpers/config.helper.ts +2 -2
  259. package/src/core/common/helpers/db.helper.ts +12 -12
  260. package/src/core/common/helpers/graphql.helper.ts +1 -1
  261. package/src/core/common/helpers/input.helper.ts +7 -4
  262. package/src/core/common/helpers/scim.helper.ts +16 -13
  263. package/src/core/common/helpers/service.helper.ts +1 -1
  264. package/src/core/common/inputs/combined-filter.input.ts +1 -1
  265. package/src/core/common/inputs/core-input.input.ts +1 -1
  266. package/src/core/common/inputs/filter.input.ts +13 -13
  267. package/src/core/common/inputs/single-filter.input.ts +2 -2
  268. package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
  269. package/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts +4 -2
  270. package/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts +4 -2
  271. package/src/core/common/interfaces/scim-array-filter-node.interface.ts +1 -1
  272. package/src/core/common/interfaces/scim-condition-node.interface.ts +1 -1
  273. package/src/core/common/interfaces/scim-logical-node.interface.ts +1 -1
  274. package/src/core/common/interfaces/server-options.interface.ts +76 -0
  275. package/src/core/common/models/core-model.model.ts +2 -4
  276. package/src/core/common/scalars/any.scalar.ts +1 -1
  277. package/src/core/common/scalars/json.scalar.ts +3 -3
  278. package/src/core/common/services/config.service.ts +17 -11
  279. package/src/core/common/services/core-cron-jobs.service.ts +6 -6
  280. package/src/core/common/services/crud.service.ts +3 -12
  281. package/src/core/common/services/mailjet.service.ts +4 -5
  282. package/src/core/common/services/module.service.ts +3 -3
  283. package/src/core/common/types/array-element.type.ts +3 -2
  284. package/src/core/common/types/require-only-one.type.ts +2 -2
  285. package/src/core/common/types/required-at-least-one.type.ts +2 -2
  286. package/src/core/common/types/scim-comparator.type.ts +1 -1
  287. package/src/core/common/types/scim-logical-operator.type.ts +1 -1
  288. package/src/core/common/types/scim-node.type.ts +1 -1
  289. package/src/core/modules/auth/guards/auth.guard.ts +4 -2
  290. package/src/core/modules/auth/guards/roles.guard.ts +17 -3
  291. package/src/core/modules/auth/tokens.decorator.ts +3 -3
  292. package/src/core/modules/better-auth/ARCHITECTURE.md +23 -20
  293. package/src/core/modules/better-auth/CUSTOMIZATION.md +64 -56
  294. package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +67 -40
  295. package/src/core/modules/better-auth/README.md +268 -230
  296. package/src/core/modules/better-auth/better-auth-roles.guard.ts +8 -1
  297. package/src/core/modules/better-auth/better-auth-token.service.ts +10 -3
  298. package/src/core/modules/better-auth/better-auth.resolver.ts +3 -1
  299. package/src/core/modules/better-auth/better-auth.types.ts +3 -1
  300. package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +3 -1
  301. package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +3 -1
  302. package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +30 -25
  303. package/src/core/modules/better-auth/core-better-auth-signup-validator.service.ts +3 -1
  304. package/src/core/modules/better-auth/core-better-auth.middleware.ts +6 -2
  305. package/src/core/modules/error-code/INTEGRATION-CHECKLIST.md +28 -21
  306. package/src/core/modules/error-code/error-codes.ts +31 -2
  307. package/src/core/modules/file/README.md +12 -10
  308. package/src/core/modules/file/core-file.service.ts +5 -9
  309. package/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md +21 -9
  310. package/src/core/modules/migrate/README.md +30 -28
  311. package/src/core/modules/migrate/cli/migrate-cli.ts +0 -3
  312. package/src/core/modules/migrate/helpers/migration.helper.ts +13 -21
  313. package/src/core/modules/migrate/migration-runner.ts +0 -3
  314. package/src/core/modules/system-setup/INTEGRATION-CHECKLIST.md +108 -0
  315. package/src/core/modules/system-setup/README.md +275 -0
  316. package/src/core/modules/system-setup/core-system-setup.controller.ts +69 -0
  317. package/src/core/modules/system-setup/core-system-setup.module.ts +19 -0
  318. package/src/core/modules/system-setup/core-system-setup.service.ts +225 -0
  319. package/src/core/modules/tus/INTEGRATION-CHECKLIST.md +15 -14
  320. package/src/core/modules/tus/README.md +50 -44
  321. package/src/core/modules/user/core-user.service.ts +1 -2
  322. package/src/core.module.ts +14 -9
  323. package/src/index.ts +8 -0
  324. package/src/server/modules/auth/auth.module.ts +1 -9
  325. package/src/server/modules/better-auth/better-auth.resolver.ts +3 -1
  326. package/src/server/modules/error-code/README.md +19 -16
  327. package/src/server/modules/error-code/error-code.controller.ts +4 -1
  328. package/src/server/modules/file/file.resolver.ts +1 -1
  329. package/src/server/modules/file/file.service.ts +1 -3
  330. package/src/server/modules/user/user.resolver.ts +1 -1
  331. package/src/test/README.md +31 -27
  332. package/src/test/test.helper.ts +18 -10
@@ -0,0 +1,225 @@
1
+ import { ForbiddenException, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
2
+ import { InjectConnection } from '@nestjs/mongoose';
3
+ import { isEmail } from 'class-validator';
4
+ import { Connection } from 'mongoose';
5
+
6
+ import { ConfigService } from '../../common/services/config.service';
7
+ import { CoreBetterAuthUserMapper } from '../better-auth/core-better-auth-user.mapper';
8
+ import { CoreBetterAuthService } from '../better-auth/core-better-auth.service';
9
+ import { ErrorCode } from '../error-code/error-codes';
10
+
11
+ /**
12
+ * Input for creating the initial admin user
13
+ */
14
+ export interface SystemSetupInitInput {
15
+ email: string;
16
+ name?: string;
17
+ password: string;
18
+ }
19
+
20
+ /**
21
+ * Response for successful init
22
+ */
23
+ export interface SystemSetupInitResult {
24
+ email: string;
25
+ message: string;
26
+ success: boolean;
27
+ }
28
+
29
+ /**
30
+ * Response for setup status check
31
+ */
32
+ export interface SystemSetupStatus {
33
+ betterAuthEnabled: boolean;
34
+ needsSetup: boolean;
35
+ }
36
+
37
+ /**
38
+ * CoreSystemSetupService provides initial admin creation for fresh deployments.
39
+ *
40
+ * This service allows creating the first admin user when the system has zero users.
41
+ * It bypasses BetterAuth's disableSignUp check by using the internal adapter directly,
42
+ * which is the same approach used by Better-Auth's own admin plugin.
43
+ *
44
+ * Security:
45
+ * - Only works when zero users exist in the database
46
+ * - Once any user exists, the init endpoint is permanently locked
47
+ * - Race conditions handled by MongoDB unique email index
48
+ */
49
+ @Injectable()
50
+ export class CoreSystemSetupService implements OnApplicationBootstrap {
51
+ private readonly logger = new Logger(CoreSystemSetupService.name);
52
+
53
+ constructor(
54
+ @InjectConnection() private readonly connection: Connection,
55
+ private readonly betterAuthService: CoreBetterAuthService,
56
+ private readonly userMapper: CoreBetterAuthUserMapper,
57
+ private readonly configService: ConfigService,
58
+ ) {}
59
+
60
+ /**
61
+ * Automatically create the initial admin on server start if configured via
62
+ * `systemSetup.initialAdmin` in config or ENV variables.
63
+ *
64
+ * Uses OnApplicationBootstrap (not OnModuleInit) to ensure BetterAuth
65
+ * is fully initialized before attempting user creation.
66
+ */
67
+ async onApplicationBootstrap(): Promise<void> {
68
+ const initialAdmin = this.configService.configFastButReadOnly?.systemSetup?.initialAdmin;
69
+
70
+ // No initialAdmin config at all → skip silently
71
+ if (!initialAdmin) {
72
+ return;
73
+ }
74
+
75
+ // Partial credentials → warn and skip
76
+ if (!initialAdmin.email || !initialAdmin.password) {
77
+ const missing = [!initialAdmin.email && 'email', !initialAdmin.password && 'password'].filter(Boolean).join(', ');
78
+ this.logger.warn(`Incomplete initialAdmin config - missing: ${missing}. Auto-creation skipped.`);
79
+ return;
80
+ }
81
+
82
+ // Validate email format (same validator as @IsEmail() decorator)
83
+ if (!isEmail(initialAdmin.email)) {
84
+ this.logger.warn(`Invalid initialAdmin email format: "${initialAdmin.email}". Auto-creation skipped.`);
85
+ return;
86
+ }
87
+
88
+ // Validate password is not empty/whitespace
89
+ if (!initialAdmin.password.trim()) {
90
+ this.logger.warn('Empty initialAdmin password. Auto-creation skipped.');
91
+ return;
92
+ }
93
+
94
+ const status = await this.getSetupStatus();
95
+ if (!status.needsSetup) {
96
+ return;
97
+ }
98
+
99
+ if (!status.betterAuthEnabled) {
100
+ this.logger.warn('Initial admin auto-creation skipped: BetterAuth not enabled');
101
+ return;
102
+ }
103
+
104
+ try {
105
+ const result = await this.createInitialAdmin({
106
+ email: initialAdmin.email,
107
+ name: initialAdmin.name,
108
+ password: initialAdmin.password,
109
+ });
110
+ this.logger.log(`Auto-created initial admin on startup: ${result.email}`);
111
+ } catch (error) {
112
+ if (error instanceof ForbiddenException) {
113
+ this.logger.log('Initial admin auto-creation skipped (users already exist)');
114
+ } else {
115
+ this.logger.warn(
116
+ `Initial admin auto-creation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
117
+ );
118
+ }
119
+ }
120
+ }
121
+
122
+ /**
123
+ * Check if the system needs initial setup (zero users)
124
+ */
125
+ async getSetupStatus(): Promise<SystemSetupStatus> {
126
+ const userCount = await this.connection.collection('users').countDocuments({});
127
+ return {
128
+ betterAuthEnabled: this.betterAuthService.isEnabled(),
129
+ needsSetup: userCount === 0,
130
+ };
131
+ }
132
+
133
+ /**
134
+ * Create the initial admin user when zero users exist.
135
+ *
136
+ * Uses BetterAuth's internalAdapter to bypass disableSignUp,
137
+ * then syncs to nest-server users collection with admin role.
138
+ */
139
+ async createInitialAdmin(input: SystemSetupInitInput): Promise<SystemSetupInitResult> {
140
+ // Pre-check: only allow when zero users exist
141
+ const userCount = await this.connection.collection('users').countDocuments({});
142
+ if (userCount > 0) {
143
+ throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
144
+ }
145
+
146
+ // Ensure BetterAuth is enabled
147
+ if (!this.betterAuthService.isEnabled()) {
148
+ throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_BETTERAUTH_REQUIRED);
149
+ }
150
+
151
+ const authInstance = this.betterAuthService.getInstance();
152
+ if (!authInstance) {
153
+ throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_BETTERAUTH_REQUIRED);
154
+ }
155
+
156
+ try {
157
+ // Access BetterAuth internal context (same pattern as core-better-auth-api.middleware.ts)
158
+ const context = await authInstance.$context;
159
+
160
+ // Normalize password for IAM (SHA256 if plain text)
161
+ const normalizedPassword = this.userMapper.normalizePasswordForIam(input.password);
162
+
163
+ // Create user via internalAdapter (bypasses disableSignUp)
164
+ const iamUser = await context.internalAdapter.createUser({
165
+ email: input.email,
166
+ emailVerified: true,
167
+ name: input.name || input.email.split('@')[0],
168
+ });
169
+
170
+ if (!iamUser) {
171
+ throw new Error('Failed to create IAM user');
172
+ }
173
+
174
+ // Hash password and create credential account
175
+ const hashedPassword = await context.password.hash(normalizedPassword);
176
+ await context.internalAdapter.linkAccount({
177
+ accountId: iamUser.id,
178
+ password: hashedPassword,
179
+ providerId: 'credential',
180
+ userId: iamUser.id,
181
+ });
182
+
183
+ // Sync to nest-server users collection
184
+ const syncedUser = await this.userMapper.linkOrCreateUser({
185
+ email: iamUser.email,
186
+ emailVerified: true,
187
+ id: iamUser.id,
188
+ name: iamUser.name,
189
+ });
190
+
191
+ if (!syncedUser) {
192
+ throw new Error('Failed to sync user to nest-server collection');
193
+ }
194
+
195
+ // Set admin role directly
196
+ await this.connection
197
+ .collection('users')
198
+ .updateOne({ _id: syncedUser._id }, { $set: { roles: ['admin'], updatedAt: new Date() } });
199
+
200
+ // Sync password to Legacy Auth for backwards compatibility
201
+ await this.userMapper.syncPasswordToLegacy(iamUser.id, input.email, input.password);
202
+
203
+ this.logger.log(`Initial admin user created: ${input.email}`);
204
+
205
+ return {
206
+ email: input.email,
207
+ message: 'Initial admin user created successfully',
208
+ success: true,
209
+ };
210
+ } catch (error) {
211
+ // Handle duplicate email (race condition via MongoDB unique index)
212
+ if (error instanceof Error && (error.message?.includes('duplicate key') || error.message?.includes('E11000'))) {
213
+ throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
214
+ }
215
+
216
+ // Re-throw known exceptions
217
+ if (error instanceof ForbiddenException) {
218
+ throw error;
219
+ }
220
+
221
+ this.logger.error(`System setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
222
+ throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
223
+ }
224
+ }
225
+ }
@@ -8,18 +8,19 @@
8
8
 
9
9
  ## Do You Need This Checklist?
10
10
 
11
- | Scenario | Checklist Needed? |
12
- |----------|-------------------|
13
- | Use TUS with defaults (everyone can upload) | No - works automatically |
14
- | Require authentication for uploads | Yes - Step 1 |
15
- | Custom upload handling (notifications, etc.) | Yes - Step 2 |
16
- | Disable TUS completely | No - just use `TusModule.forRoot({ config: false })` |
11
+ | Scenario | Checklist Needed? |
12
+ | -------------------------------------------- | ---------------------------------------------------- |
13
+ | Use TUS with defaults (everyone can upload) | No - works automatically |
14
+ | Require authentication for uploads | Yes - Step 1 |
15
+ | Custom upload handling (notifications, etc.) | Yes - Step 2 |
16
+ | Disable TUS completely | No - just use `TusModule.forRoot({ config: false })` |
17
17
 
18
18
  ---
19
19
 
20
20
  ## Reference Implementation
21
21
 
22
22
  **Local (in your node_modules):**
23
+
23
24
  ```
24
25
  node_modules/@lenne.tech/nest-server/src/server/server.module.ts
25
26
  ```
@@ -116,13 +117,13 @@ TusModule.forRoot({
116
117
  path: '/uploads',
117
118
  expiration: { expiresIn: '12h' },
118
119
  },
119
- })
120
+ });
120
121
  ```
121
122
 
122
123
  ### Disable TUS
123
124
 
124
125
  ```typescript
125
- TusModule.forRoot({ config: false })
126
+ TusModule.forRoot({ config: false });
126
127
  ```
127
128
 
128
129
  ---
@@ -140,11 +141,11 @@ TusModule.forRoot({ config: false })
140
141
 
141
142
  ## Common Mistakes
142
143
 
143
- | Mistake | Symptom | Fix |
144
- |---------|---------|-----|
145
- | Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot() |
146
- | Custom controller missing @Roles | No authentication required | Add `@Roles(RoleEnum.S_USER)` to controller class |
147
- | Using wrong endpoint path | 404 on upload | Ensure client uses same path as config |
144
+ | Mistake | Symptom | Fix |
145
+ | ------------------------------------ | ------------------------------ | ------------------------------------------------- |
146
+ | Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot() |
147
+ | Custom controller missing @Roles | No authentication required | Add `@Roles(RoleEnum.S_USER)` to controller class |
148
+ | Using wrong endpoint path | 404 on upload | Ensure client uses same path as config |
148
149
 
149
150
  ---
150
151
 
@@ -173,4 +174,4 @@ upload.start();
173
174
  ## Detailed Documentation
174
175
 
175
176
  - **README.md:** `node_modules/@lenne.tech/nest-server/src/core/modules/tus/README.md`
176
- - **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md
177
+ - **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md
@@ -12,12 +12,12 @@ Integration of the [tus.io](https://tus.io) resumable upload protocol with @lenn
12
12
  TusModule.forRoot({
13
13
  config: {
14
14
  maxSize: 100 * 1024 * 1024, // 100 MB instead of 50 GB default
15
- path: '/uploads', // Custom path instead of /tus
15
+ path: '/uploads', // Custom path instead of /tus
16
16
  },
17
- })
17
+ });
18
18
 
19
19
  // To disable:
20
- TusModule.forRoot({ config: false })
20
+ TusModule.forRoot({ config: false });
21
21
  ```
22
22
 
23
23
  **Quick Links:** [Integration Checklist](./INTEGRATION-CHECKLIST.md) | [Endpoints](#endpoints) | [Configuration](#configuration) | [Client Usage](#client-usage)
@@ -47,14 +47,14 @@ TusModule.forRoot({ config: false })
47
47
 
48
48
  ### TUS Protocol Extensions (All Enabled by Default)
49
49
 
50
- | Extension | Description |
51
- |-----------|-------------|
52
- | **creation** | Create new uploads via POST |
53
- | **creation-with-upload** | Include data in creation request |
54
- | **termination** | Delete incomplete uploads |
55
- | **expiration** | Auto-cleanup of abandoned uploads |
56
- | **checksum** | Verify data integrity |
57
- | **concatenation** | Combine multiple uploads |
50
+ | Extension | Description |
51
+ | ------------------------ | --------------------------------- |
52
+ | **creation** | Create new uploads via POST |
53
+ | **creation-with-upload** | Include data in creation request |
54
+ | **termination** | Delete incomplete uploads |
55
+ | **expiration** | Auto-cleanup of abandoned uploads |
56
+ | **checksum** | Verify data integrity |
57
+ | **concatenation** | Combine multiple uploads |
58
58
 
59
59
  ---
60
60
 
@@ -87,13 +87,13 @@ TUS is **enabled by default** with the following configuration:
87
87
 
88
88
  All endpoints are handled by the TUS protocol via `@tus/server`:
89
89
 
90
- | Method | Endpoint | Description |
91
- |--------|----------|-------------|
92
- | OPTIONS | `/tus` | Get server capabilities |
93
- | POST | `/tus` | Create new upload |
94
- | HEAD | `/tus/:id` | Get upload status/offset |
95
- | PATCH | `/tus/:id` | Continue upload |
96
- | DELETE | `/tus/:id` | Terminate upload |
90
+ | Method | Endpoint | Description |
91
+ | ------- | ---------- | ------------------------ |
92
+ | OPTIONS | `/tus` | Get server capabilities |
93
+ | POST | `/tus` | Create new upload |
94
+ | HEAD | `/tus/:id` | Get upload status/offset |
95
+ | PATCH | `/tus/:id` | Continue upload |
96
+ | DELETE | `/tus/:id` | Terminate upload |
97
97
 
98
98
  ### CORS Headers
99
99
 
@@ -115,10 +115,10 @@ The TUS server automatically handles CORS headers for browser-based clients:
115
115
 
116
116
  ```typescript
117
117
  // In server.module.ts
118
- TusModule.forRoot({ config: false })
118
+ TusModule.forRoot({ config: false });
119
119
 
120
120
  // Or via environment config
121
- tus: false
121
+ tus: false;
122
122
  ```
123
123
 
124
124
  ### Custom Configuration
@@ -148,29 +148,30 @@ TusModule.forRoot({
148
148
  expiresIn: '12h', // Cleanup after 12 hours
149
149
  },
150
150
  },
151
- })
151
+ });
152
152
  ```
153
153
 
154
154
  ### Configuration Options
155
155
 
156
- | Option | Type | Default | Description |
157
- |--------|------|---------|-------------|
158
- | `enabled` | boolean | `true` | Enable/disable TUS |
159
- | `path` | string | `/tus` | Endpoint path |
160
- | `maxSize` | number | 50 GB | Maximum file size in bytes |
161
- | `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) |
162
- | `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) |
163
- | `uploadDir` | string | `uploads/tus` | Temporary upload directory |
164
- | `creation` | boolean | `true` | Enable creation extension |
165
- | `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension |
166
- | `termination` | boolean | `true` | Enable termination extension |
167
- | `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration |
168
- | `checksum` | boolean | `true` | Enable checksum extension |
169
- | `concatenation` | boolean | `true` | Enable concatenation extension |
156
+ | Option | Type | Default | Description |
157
+ | -------------------- | ----------------- | ---------------------- | -------------------------------------------------------- |
158
+ | `enabled` | boolean | `true` | Enable/disable TUS |
159
+ | `path` | string | `/tus` | Endpoint path |
160
+ | `maxSize` | number | 50 GB | Maximum file size in bytes |
161
+ | `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) |
162
+ | `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) |
163
+ | `uploadDir` | string | `uploads/tus` | Temporary upload directory |
164
+ | `creation` | boolean | `true` | Enable creation extension |
165
+ | `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension |
166
+ | `termination` | boolean | `true` | Enable termination extension |
167
+ | `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration |
168
+ | `checksum` | boolean | `true` | Enable checksum extension |
169
+ | `concatenation` | boolean | `true` | Enable concatenation extension |
170
170
 
171
171
  **Note on `allowedHeaders`:**
172
172
 
173
173
  `@tus/server` already includes all TUS protocol headers by default:
174
+
174
175
  - Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size
175
176
  - Tus-Resumable, Tus-Version, Upload-Concat, Upload-Defer-Length
176
177
  - Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override
@@ -281,7 +282,7 @@ Then register with custom controller:
281
282
  // server.module.ts
282
283
  TusModule.forRoot({
283
284
  controller: TusController,
284
- })
285
+ });
285
286
  ```
286
287
 
287
288
  ### Custom Upload Handler
@@ -346,13 +347,13 @@ query {
346
347
 
347
348
  The following metadata is stored with each GridFS file:
348
349
 
349
- | Field | Source |
350
- |-------|--------|
351
- | `filename` | From TUS `Upload-Metadata` header |
352
- | `contentType` | From TUS `filetype` metadata |
353
- | `tusUploadId` | Original TUS upload ID |
354
- | `originalMetadata` | All TUS metadata |
355
- | `uploadedAt` | Completion timestamp |
350
+ | Field | Source |
351
+ | ------------------ | --------------------------------- |
352
+ | `filename` | From TUS `Upload-Metadata` header |
353
+ | `contentType` | From TUS `filetype` metadata |
354
+ | `tusUploadId` | Original TUS upload ID |
355
+ | `originalMetadata` | All TUS metadata |
356
+ | `uploadedAt` | Completion timestamp |
356
357
 
357
358
  ---
358
359
 
@@ -363,6 +364,7 @@ The following metadata is stored with each GridFS file:
363
364
  **Cause:** TUS server not initialized
364
365
 
365
366
  **Solutions:**
367
+
366
368
  1. Check if TUS is disabled in config (`tus: false`)
367
369
  2. Verify MongoDB connection is established
368
370
  3. Check server logs for initialization errors
@@ -372,6 +374,7 @@ The following metadata is stored with each GridFS file:
372
374
  **Cause:** Upload expired or server restarted
373
375
 
374
376
  **Solutions:**
377
+
375
378
  1. Check expiration configuration (default: 24h)
376
379
  2. Increase `expiration.expiresIn` if needed
377
380
  3. Client should handle `onError` and create new upload
@@ -381,6 +384,7 @@ The following metadata is stored with each GridFS file:
381
384
  **Cause:** Missing or incorrect CORS configuration
382
385
 
383
386
  **Solutions:**
387
+
384
388
  1. Verify client sends correct headers
385
389
  2. Check that `Tus-Resumable` header is included
386
390
  3. Ensure server CORS allows TUS headers
@@ -390,6 +394,7 @@ The following metadata is stored with each GridFS file:
390
394
  **Cause:** Upload incomplete or migration failed
391
395
 
392
396
  **Solutions:**
397
+
393
398
  1. Verify upload completed (check `onSuccess` callback)
394
399
  2. Check server logs for migration errors
395
400
  3. Verify MongoDB GridFS bucket exists (`fs.files`, `fs.chunks`)
@@ -399,6 +404,7 @@ The following metadata is stored with each GridFS file:
399
404
  **Cause:** File exceeds `maxSize` limit
400
405
 
401
406
  **Solutions:**
407
+
402
408
  1. Increase `maxSize` in configuration
403
409
  2. Check for proxy/nginx upload limits
404
410
  3. Verify client `chunkSize` is reasonable
@@ -436,4 +442,4 @@ The following metadata is stored with each GridFS file:
436
442
  - [tus.io Protocol](https://tus.io/protocols/resumable-upload)
437
443
  - [tus-js-client](https://github.com/tus/tus-js-client)
438
444
  - [@tus/server](https://github.com/tus/tus-node-server)
439
- - [FileModule Documentation](../file/README.md)
445
+ - [FileModule Documentation](../file/README.md)
@@ -121,8 +121,7 @@ export abstract class CoreUserService<
121
121
  /**
122
122
  * Get verified state of user by token
123
123
  */
124
- // eslint-disable-next-line unused-imports/no-unused-vars
125
- async getVerifiedState(token: string, serviceOptions?: ServiceOptions): Promise<boolean> {
124
+ async getVerifiedState(token: string, _serviceOptions?: ServiceOptions): Promise<boolean> {
126
125
  const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
127
126
 
128
127
  if (!user) {
@@ -24,6 +24,7 @@ import { CoreBetterAuthModule } from './core/modules/better-auth/core-better-aut
24
24
  import { CoreBetterAuthService } from './core/modules/better-auth/core-better-auth.service';
25
25
  import { ErrorCodeModule } from './core/modules/error-code/error-code.module';
26
26
  import { CoreHealthCheckModule } from './core/modules/health-check/core-health-check.module';
27
+ import { CoreSystemSetupModule } from './core/modules/system-setup/core-system-setup.module';
27
28
 
28
29
  /**
29
30
  * Core module (dynamic)
@@ -143,9 +144,9 @@ export class CoreModule implements NestModule {
143
144
 
144
145
  // Build GraphQL driver configuration based on auth mode
145
146
  const graphQlDriverConfig = isIamOnlyMode
146
- ? (isAutoRegisterDisabledEarly
147
+ ? isAutoRegisterDisabledEarly
147
148
  ? this.buildLazyIamGraphQlDriver(cors, options)
148
- : this.buildIamOnlyGraphQlDriver(cors, options))
149
+ : this.buildIamOnlyGraphQlDriver(cors, options)
149
150
  : this.buildLegacyGraphQlDriver(AuthService, AuthModule, cors, options);
150
151
 
151
152
  const config: IServerOptions = merge(
@@ -261,16 +262,14 @@ export class CoreModule implements NestModule {
261
262
  // Determine if BetterAuth is explicitly disabled
262
263
  // In IAM-only mode: enabled by default (undefined = true), only false or { enabled: false } disables
263
264
  // In Legacy mode: disabled by default (undefined = false), must be explicitly enabled
264
- const isExplicitlyDisabled = betterAuthConfig === false ||
265
- (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false);
266
- const isExplicitlyEnabled = betterAuthConfig === true ||
267
- (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false);
265
+ const isExplicitlyDisabled =
266
+ betterAuthConfig === false || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false);
267
+ const isExplicitlyEnabled =
268
+ betterAuthConfig === true || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false);
268
269
 
269
270
  // IAM-only mode: enabled unless explicitly disabled
270
271
  // Legacy mode: enabled only if explicitly enabled
271
- const isBetterAuthEnabled = isIamOnlyMode
272
- ? !isExplicitlyDisabled
273
- : isExplicitlyEnabled;
272
+ const isBetterAuthEnabled = isIamOnlyMode ? !isExplicitlyDisabled : isExplicitlyEnabled;
274
273
 
275
274
  const isAutoRegister = typeof betterAuthConfig === 'object' && betterAuthConfig?.autoRegister === true;
276
275
  // autoRegister: false means the project imports its own BetterAuthModule separately
@@ -304,6 +303,12 @@ export class CoreModule implements NestModule {
304
303
  }
305
304
  }
306
305
 
306
+ // Add CoreSystemSetupModule when BetterAuth is active
307
+ // Enabled by default - disable explicitly via systemSetup: { enabled: false }
308
+ if (isBetterAuthEnabled && config.systemSetup?.enabled !== false) {
309
+ imports.push(CoreSystemSetupModule);
310
+ }
311
+
307
312
  // Set exports
308
313
  const exports: any[] = [ConfigService, EmailService, TemplateService, MailjetService];
309
314
  if (!process.env.VITEST) {
package/src/index.ts CHANGED
@@ -167,6 +167,14 @@ export * from './core/modules/health-check/core-health-check.service';
167
167
 
168
168
  export * from './core/modules/migrate';
169
169
 
170
+ // =====================================================================================================================
171
+ // Core - Modules - SystemSetup
172
+ // =====================================================================================================================
173
+
174
+ export * from './core/modules/system-setup/core-system-setup.controller';
175
+ export * from './core/modules/system-setup/core-system-setup.module';
176
+ export * from './core/modules/system-setup/core-system-setup.service';
177
+
170
178
  // =====================================================================================================================
171
179
  // Core - Modules - Tus
172
180
  // =====================================================================================================================
@@ -22,15 +22,7 @@ export class AuthModule {
22
22
  return {
23
23
  controllers: [AuthController],
24
24
  exports: [AuthController, AuthResolver, CoreAuthModule, AuthService],
25
- imports: [
26
- CoreAuthModule.forRoot(UserModule, UserService, {
27
- ...options,
28
- ...{
29
- // imports: [], // Integrate additional Services here to resolve dependencies
30
- // providers: [] // Integrate additional Providers here to resolve dependencies
31
- },
32
- }),
33
- ],
25
+ imports: [CoreAuthModule.forRoot(UserModule, UserService, { ...options })],
34
26
  module: AuthModule,
35
27
  providers: [AuthController, AuthResolver, AuthService, EmailService],
36
28
  };
@@ -107,7 +107,9 @@ export class BetterAuthResolver extends CoreBetterAuthResolver {
107
107
  nullable: true,
108
108
  })
109
109
  @Roles(RoleEnum.S_USER)
110
- override async betterAuthListPasskeys(@Context() ctx: { req: Request }): Promise<CoreBetterAuthPasskeyModel[] | null> {
110
+ override async betterAuthListPasskeys(
111
+ @Context() ctx: { req: Request },
112
+ ): Promise<CoreBetterAuthPasskeyModel[] | null> {
111
113
  return super.betterAuthListPasskeys(ctx);
112
114
  }
113
115