@hilbras/keystone 1.6.0 → 1.9.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 (559) hide show
  1. package/CHANGELOG.md +239 -0
  2. package/README.md +55 -25
  3. package/dist/cli.js +25 -27
  4. package/dist/cli.js.map +1 -1
  5. package/dist/config.d.ts +15 -1
  6. package/dist/config.d.ts.map +1 -1
  7. package/dist/config.js +45 -8
  8. package/dist/config.js.map +1 -1
  9. package/dist/container.d.ts +4 -1
  10. package/dist/container.d.ts.map +1 -1
  11. package/dist/container.js.map +1 -1
  12. package/dist/db/migrations/0008_flashy_firestar.sql +5 -0
  13. package/dist/db/migrations/0009_daffy_changeling.sql +1 -0
  14. package/dist/db/migrations/0010_wealthy_shadow_king.sql +37 -0
  15. package/dist/db/migrations/0011_overrated_vector.sql +18 -0
  16. package/dist/db/migrations/0012_brave_darkhawk.sql +28 -0
  17. package/dist/db/migrations/0013_wonderful_chimera.sql +5 -0
  18. package/dist/db/migrations/0014_magical_morph.sql +48 -0
  19. package/{src/db/migrations/meta/0007_snapshot.json → dist/db/migrations/meta/0008_snapshot.json} +136 -32
  20. package/{src/db/migrations/meta/0006_snapshot.json → dist/db/migrations/meta/0009_snapshot.json} +359 -30
  21. package/{src/db/migrations/meta/0005_snapshot.json → dist/db/migrations/meta/0010_snapshot.json} +459 -29
  22. package/{src/db/migrations/meta/0004_snapshot.json → dist/db/migrations/meta/0011_snapshot.json} +594 -30
  23. package/dist/db/migrations/meta/0012_snapshot.json +3891 -0
  24. package/dist/db/migrations/meta/0013_snapshot.json +3919 -0
  25. package/dist/db/migrations/meta/0014_snapshot.json +4311 -0
  26. package/dist/db/migrations/meta/_journal.json +49 -0
  27. package/dist/db/reencryptOidcSecrets.d.ts +2 -0
  28. package/dist/db/reencryptOidcSecrets.d.ts.map +1 -0
  29. package/dist/db/reencryptOidcSecrets.js +41 -0
  30. package/dist/db/reencryptOidcSecrets.js.map +1 -0
  31. package/dist/db/schema.d.ts +2521 -53
  32. package/dist/db/schema.d.ts.map +1 -1
  33. package/dist/db/schema.js +118 -3
  34. package/dist/db/schema.js.map +1 -1
  35. package/dist/db/seed.js +67 -40
  36. package/dist/db/seed.js.map +1 -1
  37. package/dist/di.d.ts.map +1 -1
  38. package/dist/di.js +11 -3
  39. package/dist/di.js.map +1 -1
  40. package/dist/index.d.ts +2 -2
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +26 -2
  43. package/dist/index.js.map +1 -1
  44. package/dist/lib/errors.d.ts +2 -1
  45. package/dist/lib/errors.d.ts.map +1 -1
  46. package/dist/lib/errors.js +10 -0
  47. package/dist/lib/errors.js.map +1 -1
  48. package/dist/plugins/appContext.d.ts.map +1 -1
  49. package/dist/plugins/appContext.js +3 -12
  50. package/dist/plugins/appContext.js.map +1 -1
  51. package/dist/plugins/audit.d.ts.map +1 -1
  52. package/dist/plugins/audit.js +26 -6
  53. package/dist/plugins/audit.js.map +1 -1
  54. package/dist/plugins/auth.d.ts.map +1 -1
  55. package/dist/plugins/auth.js +32 -7
  56. package/dist/plugins/auth.js.map +1 -1
  57. package/dist/plugins/metrics.d.ts.map +1 -1
  58. package/dist/plugins/mtls.d.ts.map +1 -1
  59. package/dist/plugins/permissions.d.ts.map +1 -1
  60. package/dist/plugins/permissions.js +29 -9
  61. package/dist/plugins/permissions.js.map +1 -1
  62. package/dist/plugins/rateLimit.d.ts +15 -0
  63. package/dist/plugins/rateLimit.d.ts.map +1 -1
  64. package/dist/plugins/rateLimit.js +11 -1
  65. package/dist/plugins/rateLimit.js.map +1 -1
  66. package/dist/plugins/requestLogger.d.ts.map +1 -1
  67. package/dist/repositories/apiKey.d.ts.map +1 -1
  68. package/dist/repositories/application.d.ts.map +1 -1
  69. package/dist/repositories/application.js +1 -1
  70. package/dist/repositories/application.js.map +1 -1
  71. package/dist/repositories/audit.d.ts.map +1 -1
  72. package/dist/repositories/index.d.ts +3 -0
  73. package/dist/repositories/index.d.ts.map +1 -1
  74. package/dist/repositories/index.js +3 -0
  75. package/dist/repositories/index.js.map +1 -1
  76. package/dist/repositories/mfaChallenge.d.ts +23 -0
  77. package/dist/repositories/mfaChallenge.d.ts.map +1 -0
  78. package/dist/repositories/mfaChallenge.js +71 -0
  79. package/dist/repositories/mfaChallenge.js.map +1 -0
  80. package/dist/repositories/oidcConnection.d.ts +27 -43
  81. package/dist/repositories/oidcConnection.d.ts.map +1 -1
  82. package/dist/repositories/oidcConnection.js +15 -6
  83. package/dist/repositories/oidcConnection.js.map +1 -1
  84. package/dist/repositories/organization.d.ts +9 -9
  85. package/dist/repositories/organization.d.ts.map +1 -1
  86. package/dist/repositories/organization.js +91 -37
  87. package/dist/repositories/organization.js.map +1 -1
  88. package/dist/repositories/permission.d.ts.map +1 -1
  89. package/dist/repositories/permission.js +27 -5
  90. package/dist/repositories/permission.js.map +1 -1
  91. package/dist/repositories/samlConnection.d.ts +28 -28
  92. package/dist/repositories/samlConnection.d.ts.map +1 -1
  93. package/dist/repositories/samlConnection.js +12 -4
  94. package/dist/repositories/samlConnection.js.map +1 -1
  95. package/dist/repositories/scimConnection.d.ts +38 -0
  96. package/dist/repositories/scimConnection.d.ts.map +1 -0
  97. package/dist/repositories/scimConnection.js +123 -0
  98. package/dist/repositories/scimConnection.js.map +1 -0
  99. package/dist/repositories/scimGroup.d.ts +36 -0
  100. package/dist/repositories/scimGroup.d.ts.map +1 -0
  101. package/dist/repositories/scimGroup.js +113 -0
  102. package/dist/repositories/scimGroup.js.map +1 -0
  103. package/dist/repositories/session.d.ts +23 -13
  104. package/dist/repositories/session.d.ts.map +1 -1
  105. package/dist/repositories/session.js +13 -1
  106. package/dist/repositories/session.js.map +1 -1
  107. package/dist/repositories/types.d.ts +112 -5
  108. package/dist/repositories/types.d.ts.map +1 -1
  109. package/dist/repositories/types.js +7 -1
  110. package/dist/repositories/types.js.map +1 -1
  111. package/dist/repositories/user.d.ts +23 -1
  112. package/dist/repositories/user.d.ts.map +1 -1
  113. package/dist/repositories/user.js +180 -4
  114. package/dist/repositories/user.js.map +1 -1
  115. package/dist/routes/admin/billing.js +4 -4
  116. package/dist/routes/admin/billing.js.map +1 -1
  117. package/dist/routes/admin/helpers.d.ts +16 -20
  118. package/dist/routes/admin/helpers.d.ts.map +1 -1
  119. package/dist/routes/admin/helpers.js +53 -10
  120. package/dist/routes/admin/helpers.js.map +1 -1
  121. package/dist/routes/admin/organizations.d.ts.map +1 -1
  122. package/dist/routes/admin/organizations.js +76 -69
  123. package/dist/routes/admin/organizations.js.map +1 -1
  124. package/dist/routes/admin/permissions.d.ts.map +1 -1
  125. package/dist/routes/admin/permissions.js +48 -14
  126. package/dist/routes/admin/permissions.js.map +1 -1
  127. package/dist/routes/admin/platform.d.ts.map +1 -1
  128. package/dist/routes/admin/platform.js +86 -35
  129. package/dist/routes/admin/platform.js.map +1 -1
  130. package/dist/routes/admin/sso.d.ts.map +1 -1
  131. package/dist/routes/admin/sso.js +143 -12
  132. package/dist/routes/admin/sso.js.map +1 -1
  133. package/dist/routes/admin/webhooks.js +8 -8
  134. package/dist/routes/admin/webhooks.js.map +1 -1
  135. package/dist/routes/apiKeys.d.ts.map +1 -1
  136. package/dist/routes/apiKeys.js +23 -5
  137. package/dist/routes/apiKeys.js.map +1 -1
  138. package/dist/routes/auth.d.ts.map +1 -1
  139. package/dist/routes/auth.js +112 -22
  140. package/dist/routes/auth.js.map +1 -1
  141. package/dist/routes/authz.d.ts.map +1 -1
  142. package/dist/routes/authz.js +16 -4
  143. package/dist/routes/authz.js.map +1 -1
  144. package/dist/routes/config.d.ts.map +1 -1
  145. package/dist/routes/config.js +16 -14
  146. package/dist/routes/config.js.map +1 -1
  147. package/dist/routes/federation.d.ts.map +1 -1
  148. package/dist/routes/federation.js +17 -3
  149. package/dist/routes/federation.js.map +1 -1
  150. package/dist/routes/magicLinks.d.ts.map +1 -1
  151. package/dist/routes/magicLinks.js +15 -3
  152. package/dist/routes/magicLinks.js.map +1 -1
  153. package/dist/routes/oauth.d.ts.map +1 -1
  154. package/dist/routes/oauth.js +22 -3
  155. package/dist/routes/oauth.js.map +1 -1
  156. package/dist/routes/oauth2.d.ts.map +1 -1
  157. package/dist/routes/oauth2.js +104 -11
  158. package/dist/routes/oauth2.js.map +1 -1
  159. package/dist/routes/oidcEnterprise.d.ts.map +1 -1
  160. package/dist/routes/oidcEnterprise.js +67 -21
  161. package/dist/routes/oidcEnterprise.js.map +1 -1
  162. package/dist/routes/password.d.ts.map +1 -1
  163. package/dist/routes/password.js.map +1 -1
  164. package/dist/routes/profile.js +4 -4
  165. package/dist/routes/profile.js.map +1 -1
  166. package/dist/routes/saml.d.ts +9 -0
  167. package/dist/routes/saml.d.ts.map +1 -1
  168. package/dist/routes/saml.js +187 -11
  169. package/dist/routes/saml.js.map +1 -1
  170. package/dist/routes/scim.d.ts +13 -0
  171. package/dist/routes/scim.d.ts.map +1 -1
  172. package/dist/routes/scim.js +885 -110
  173. package/dist/routes/scim.js.map +1 -1
  174. package/dist/routes/sdk.d.ts.map +1 -1
  175. package/dist/routes/sdk.js +24 -8
  176. package/dist/routes/sdk.js.map +1 -1
  177. package/dist/routes/serviceAccounts.d.ts.map +1 -1
  178. package/dist/routes/serviceAccounts.js +2 -1
  179. package/dist/routes/serviceAccounts.js.map +1 -1
  180. package/dist/routes/setup.d.ts.map +1 -1
  181. package/dist/routes/setup.js +15 -16
  182. package/dist/routes/setup.js.map +1 -1
  183. package/dist/routes/smsOtp.js +1 -1
  184. package/dist/routes/smsOtp.js.map +1 -1
  185. package/dist/routes/totp.d.ts.map +1 -1
  186. package/dist/routes/totp.js +113 -23
  187. package/dist/routes/totp.js.map +1 -1
  188. package/dist/routes/webauthn.d.ts.map +1 -1
  189. package/dist/routes/webauthn.js +44 -8
  190. package/dist/routes/webauthn.js.map +1 -1
  191. package/dist/routes/workflows.d.ts.map +1 -1
  192. package/dist/routes/workflows.js +58 -25
  193. package/dist/routes/workflows.js.map +1 -1
  194. package/dist/sdk/index.d.ts.map +1 -1
  195. package/dist/sdk/index.js +141 -40
  196. package/dist/sdk/index.js.map +1 -1
  197. package/dist/sdk/types.d.ts +60 -29
  198. package/dist/sdk/types.d.ts.map +1 -1
  199. package/dist/services/application/authentication.d.ts +39 -1
  200. package/dist/services/application/authentication.d.ts.map +1 -1
  201. package/dist/services/application/authentication.js +43 -1
  202. package/dist/services/application/authentication.js.map +1 -1
  203. package/dist/services/application/identity.d.ts +10 -7
  204. package/dist/services/application/identity.d.ts.map +1 -1
  205. package/dist/services/application/identity.js +13 -10
  206. package/dist/services/application/identity.js.map +1 -1
  207. package/dist/services/application/organization.d.ts +11 -7
  208. package/dist/services/application/organization.d.ts.map +1 -1
  209. package/dist/services/application/organization.js +160 -12
  210. package/dist/services/application/organization.js.map +1 -1
  211. package/dist/services/applications.js +2 -2
  212. package/dist/services/applications.js.map +1 -1
  213. package/dist/services/audit.d.ts +1 -0
  214. package/dist/services/audit.d.ts.map +1 -1
  215. package/dist/services/audit.js +13 -0
  216. package/dist/services/audit.js.map +1 -1
  217. package/dist/services/cache.d.ts.map +1 -1
  218. package/dist/services/configuration/profiles.d.ts +4 -0
  219. package/dist/services/configuration/profiles.d.ts.map +1 -1
  220. package/dist/services/configuration/profiles.js +50 -0
  221. package/dist/services/configuration/profiles.js.map +1 -1
  222. package/dist/services/configuration.d.ts.map +1 -1
  223. package/dist/services/configuration.js.map +1 -1
  224. package/dist/services/connectors/google.d.ts.map +1 -1
  225. package/dist/services/connectors/google.js +3 -2
  226. package/dist/services/connectors/google.js.map +1 -1
  227. package/dist/services/connectors/oidc.d.ts.map +1 -1
  228. package/dist/services/connectors/oidc.js +6 -3
  229. package/dist/services/connectors/oidc.js.map +1 -1
  230. package/dist/services/connectors/zitadel.d.ts.map +1 -1
  231. package/dist/services/connectors/zitadel.js +4 -3
  232. package/dist/services/connectors/zitadel.js.map +1 -1
  233. package/dist/services/domain/authentication.d.ts +43 -4
  234. package/dist/services/domain/authentication.d.ts.map +1 -1
  235. package/dist/services/domain/authentication.js +82 -20
  236. package/dist/services/domain/authentication.js.map +1 -1
  237. package/dist/services/domain/authorization.d.ts +11 -0
  238. package/dist/services/domain/authorization.d.ts.map +1 -1
  239. package/dist/services/domain/authorization.js +36 -1
  240. package/dist/services/domain/authorization.js.map +1 -1
  241. package/dist/services/domain/identity.d.ts +21 -9
  242. package/dist/services/domain/identity.d.ts.map +1 -1
  243. package/dist/services/domain/identity.js +187 -10
  244. package/dist/services/domain/identity.js.map +1 -1
  245. package/dist/services/domain/organization.d.ts +6 -9
  246. package/dist/services/domain/organization.d.ts.map +1 -1
  247. package/dist/services/domain/organization.js +48 -30
  248. package/dist/services/domain/organization.js.map +1 -1
  249. package/dist/services/emailVerification.d.ts +2 -2
  250. package/dist/services/enterpriseSso.d.ts +13 -6
  251. package/dist/services/enterpriseSso.d.ts.map +1 -1
  252. package/dist/services/enterpriseSso.js +75 -6
  253. package/dist/services/enterpriseSso.js.map +1 -1
  254. package/dist/services/events/subscribers/auditLog.js +1 -1
  255. package/dist/services/events/subscribers/auditLog.js.map +1 -1
  256. package/dist/services/events/types.d.ts +7 -1
  257. package/dist/services/events/types.d.ts.map +1 -1
  258. package/dist/services/events/types.js.map +1 -1
  259. package/dist/services/events/validate.d.ts.map +1 -1
  260. package/dist/services/events/validate.js +27 -0
  261. package/dist/services/events/validate.js.map +1 -1
  262. package/dist/services/features.d.ts.map +1 -1
  263. package/dist/services/features.js.map +1 -1
  264. package/dist/services/federation.d.ts +6 -1
  265. package/dist/services/federation.d.ts.map +1 -1
  266. package/dist/services/federation.js +31 -4
  267. package/dist/services/federation.js.map +1 -1
  268. package/dist/services/ipControls.js +2 -2
  269. package/dist/services/ipControls.js.map +1 -1
  270. package/dist/services/magicLinks.d.ts +2 -2
  271. package/dist/services/mfa.d.ts +53 -0
  272. package/dist/services/mfa.d.ts.map +1 -0
  273. package/dist/services/mfa.js +157 -0
  274. package/dist/services/mfa.js.map +1 -0
  275. package/dist/services/oauth2.d.ts +16 -12
  276. package/dist/services/oauth2.d.ts.map +1 -1
  277. package/dist/services/oauth2.js +22 -13
  278. package/dist/services/oauth2.js.map +1 -1
  279. package/dist/services/oidcSecretFormat.d.ts +3 -0
  280. package/dist/services/oidcSecretFormat.d.ts.map +1 -0
  281. package/dist/services/oidcSecretFormat.js +5 -0
  282. package/dist/services/oidcSecretFormat.js.map +1 -0
  283. package/dist/services/organizations.d.ts +4 -16
  284. package/dist/services/organizations.d.ts.map +1 -1
  285. package/dist/services/organizations.js +0 -62
  286. package/dist/services/organizations.js.map +1 -1
  287. package/dist/services/permissions.d.ts.map +1 -1
  288. package/dist/services/permissions.js +9 -1
  289. package/dist/services/permissions.js.map +1 -1
  290. package/dist/services/plugins/registry.d.ts.map +1 -1
  291. package/dist/services/plugins/registry.js.map +1 -1
  292. package/dist/services/plugins/types.d.ts.map +1 -1
  293. package/dist/services/queue/bullmq.d.ts.map +1 -1
  294. package/dist/services/queue/inProcess.d.ts.map +1 -1
  295. package/dist/services/redis.d.ts +1 -1
  296. package/dist/services/redis.d.ts.map +1 -1
  297. package/dist/services/scimCredentials.d.ts +46 -0
  298. package/dist/services/scimCredentials.d.ts.map +1 -0
  299. package/dist/services/scimCredentials.js +123 -0
  300. package/dist/services/scimCredentials.js.map +1 -0
  301. package/dist/services/scimLegacyMigration.d.ts +12 -0
  302. package/dist/services/scimLegacyMigration.d.ts.map +1 -0
  303. package/dist/services/scimLegacyMigration.js +44 -0
  304. package/dist/services/scimLegacyMigration.js.map +1 -0
  305. package/dist/services/secrets/awsKms.d.ts +2 -2
  306. package/dist/services/secrets/awsKms.d.ts.map +1 -1
  307. package/dist/services/secrets/awsKms.js +3 -5
  308. package/dist/services/secrets/awsKms.js.map +1 -1
  309. package/dist/services/secrets/azureKeyVault.d.ts.map +1 -1
  310. package/dist/services/secrets/database.d.ts.map +1 -1
  311. package/dist/services/secrets/database.js.map +1 -1
  312. package/dist/services/secrets/environment.d.ts.map +1 -1
  313. package/dist/services/secrets/environment.js.map +1 -1
  314. package/dist/services/secrets/index.d.ts.map +1 -1
  315. package/dist/services/secrets/password.d.ts.map +1 -1
  316. package/dist/services/secrets/password.js +0 -4
  317. package/dist/services/secrets/password.js.map +1 -1
  318. package/dist/services/secrets/provider.d.ts +2 -3
  319. package/dist/services/secrets/provider.d.ts.map +1 -1
  320. package/dist/services/secrets/vault.d.ts.map +1 -1
  321. package/dist/services/setup/configWriter.d.ts.map +1 -1
  322. package/dist/services/setup/configWriter.js.map +1 -1
  323. package/dist/services/ssoEndpointPolicy.d.ts +8 -0
  324. package/dist/services/ssoEndpointPolicy.d.ts.map +1 -0
  325. package/dist/services/ssoEndpointPolicy.js +136 -0
  326. package/dist/services/ssoEndpointPolicy.js.map +1 -0
  327. package/dist/services/stepUp.d.ts +35 -0
  328. package/dist/services/stepUp.d.ts.map +1 -0
  329. package/dist/services/stepUp.js +65 -0
  330. package/dist/services/stepUp.js.map +1 -0
  331. package/dist/services/tokens.d.ts +37 -11
  332. package/dist/services/tokens.d.ts.map +1 -1
  333. package/dist/services/tokens.js +75 -14
  334. package/dist/services/tokens.js.map +1 -1
  335. package/dist/services/totp.d.ts +46 -0
  336. package/dist/services/totp.d.ts.map +1 -1
  337. package/dist/services/totp.js +178 -41
  338. package/dist/services/totp.js.map +1 -1
  339. package/dist/services/users.d.ts +20 -12
  340. package/dist/services/users.d.ts.map +1 -1
  341. package/dist/services/users.js +24 -51
  342. package/dist/services/users.js.map +1 -1
  343. package/dist/services/webauthn.d.ts +8 -4
  344. package/dist/services/webauthn.d.ts.map +1 -1
  345. package/dist/services/webauthn.js +4 -4
  346. package/dist/services/webauthn.js.map +1 -1
  347. package/dist/services/webhooks.d.ts +20 -20
  348. package/dist/services/workflows/engine.d.ts +4 -2
  349. package/dist/services/workflows/engine.d.ts.map +1 -1
  350. package/dist/services/workflows/engine.js +181 -12
  351. package/dist/services/workflows/engine.js.map +1 -1
  352. package/dist/services/workflows/steps.d.ts +2 -0
  353. package/dist/services/workflows/steps.d.ts.map +1 -1
  354. package/dist/services/workflows/steps.js +8 -75
  355. package/dist/services/workflows/steps.js.map +1 -1
  356. package/dist/setup-server.js.map +1 -1
  357. package/dist/types.d.ts +33 -4
  358. package/dist/types.d.ts.map +1 -1
  359. package/dist/types.js +26 -2
  360. package/dist/types.js.map +1 -1
  361. package/package.json +26 -3
  362. package/dist/tests/errors.test.d.ts +0 -2
  363. package/dist/tests/errors.test.d.ts.map +0 -1
  364. package/dist/tests/errors.test.js +0 -64
  365. package/dist/tests/errors.test.js.map +0 -1
  366. package/dist/tests/events.test.d.ts +0 -2
  367. package/dist/tests/events.test.d.ts.map +0 -1
  368. package/dist/tests/events.test.js +0 -45
  369. package/dist/tests/events.test.js.map +0 -1
  370. package/dist/tests/featureFlags.test.d.ts +0 -2
  371. package/dist/tests/featureFlags.test.d.ts.map +0 -1
  372. package/dist/tests/featureFlags.test.js +0 -24
  373. package/dist/tests/featureFlags.test.js.map +0 -1
  374. package/dist/tests/integration/queue.test.d.ts +0 -2
  375. package/dist/tests/integration/queue.test.d.ts.map +0 -1
  376. package/dist/tests/integration/queue.test.js +0 -49
  377. package/dist/tests/integration/queue.test.js.map +0 -1
  378. package/dist/tests/plugins.test.d.ts +0 -2
  379. package/dist/tests/plugins.test.d.ts.map +0 -1
  380. package/dist/tests/plugins.test.js +0 -56
  381. package/dist/tests/plugins.test.js.map +0 -1
  382. package/dist/tests/result.test.d.ts +0 -2
  383. package/dist/tests/result.test.d.ts.map +0 -1
  384. package/dist/tests/result.test.js +0 -46
  385. package/dist/tests/result.test.js.map +0 -1
  386. package/dist/tests/setup/configWriter.test.d.ts +0 -2
  387. package/dist/tests/setup/configWriter.test.d.ts.map +0 -1
  388. package/dist/tests/setup/configWriter.test.js +0 -55
  389. package/dist/tests/setup/configWriter.test.js.map +0 -1
  390. package/dist/tests/setup/validation.test.d.ts +0 -2
  391. package/dist/tests/setup/validation.test.d.ts.map +0 -1
  392. package/dist/tests/setup/validation.test.js +0 -26
  393. package/dist/tests/setup/validation.test.js.map +0 -1
  394. package/dist/tests/smoke.test.d.ts +0 -2
  395. package/dist/tests/smoke.test.d.ts.map +0 -1
  396. package/dist/tests/smoke.test.js +0 -124
  397. package/dist/tests/smoke.test.js.map +0 -1
  398. package/src/cli.ts +0 -172
  399. package/src/config.ts +0 -143
  400. package/src/container.ts +0 -48
  401. package/src/db/index.ts +0 -53
  402. package/src/db/migrations/0000_skinny_ben_parker.sql +0 -553
  403. package/src/db/migrations/0001_brief_joseph.sql +0 -10
  404. package/src/db/migrations/0002_add_account_lockout.sql +0 -3
  405. package/src/db/migrations/0003_steep_rachel_grey.sql +0 -1
  406. package/src/db/migrations/0004_clever_bill_hollister.sql +0 -20
  407. package/src/db/migrations/0005_steep_the_call.sql +0 -2
  408. package/src/db/migrations/0006_ambitious_boomer.sql +0 -17
  409. package/src/db/migrations/0007_greedy_vindicator.sql +0 -40
  410. package/src/db/migrations/meta/0000_snapshot.json +0 -2964
  411. package/src/db/migrations/meta/0001_snapshot.json +0 -3031
  412. package/src/db/migrations/meta/0003_snapshot.json +0 -3051
  413. package/src/db/migrations/meta/_journal.json +0 -62
  414. package/src/db/schema.ts +0 -676
  415. package/src/db/seed.ts +0 -146
  416. package/src/di.ts +0 -81
  417. package/src/index.ts +0 -326
  418. package/src/lib/errors.ts +0 -139
  419. package/src/lib/result.ts +0 -44
  420. package/src/lib/webhookSignature.ts +0 -41
  421. package/src/plugins/appContext.ts +0 -76
  422. package/src/plugins/audit.ts +0 -42
  423. package/src/plugins/auth.ts +0 -230
  424. package/src/plugins/metrics.ts +0 -41
  425. package/src/plugins/mtls.ts +0 -94
  426. package/src/plugins/permissions.ts +0 -29
  427. package/src/plugins/rateLimit.ts +0 -133
  428. package/src/plugins/requestLogger.ts +0 -25
  429. package/src/plugins/tracing.ts +0 -22
  430. package/src/repositories/apiKey.ts +0 -158
  431. package/src/repositories/application.ts +0 -70
  432. package/src/repositories/audit.ts +0 -32
  433. package/src/repositories/index.ts +0 -9
  434. package/src/repositories/oidcConnection.ts +0 -111
  435. package/src/repositories/organization.ts +0 -167
  436. package/src/repositories/permission.ts +0 -153
  437. package/src/repositories/samlConnection.ts +0 -96
  438. package/src/repositories/session.ts +0 -86
  439. package/src/repositories/types.ts +0 -134
  440. package/src/repositories/user.ts +0 -161
  441. package/src/routes/admin/billing.ts +0 -48
  442. package/src/routes/admin/helpers.ts +0 -50
  443. package/src/routes/admin/index.ts +0 -16
  444. package/src/routes/admin/organizations.ts +0 -299
  445. package/src/routes/admin/permissions.ts +0 -80
  446. package/src/routes/admin/platform.ts +0 -335
  447. package/src/routes/admin/sso.ts +0 -138
  448. package/src/routes/admin/webhooks.ts +0 -73
  449. package/src/routes/admin.ts +0 -1
  450. package/src/routes/apiKeys.ts +0 -60
  451. package/src/routes/auth.ts +0 -214
  452. package/src/routes/authz.ts +0 -38
  453. package/src/routes/config.ts +0 -67
  454. package/src/routes/emailVerification.ts +0 -73
  455. package/src/routes/federation.ts +0 -156
  456. package/src/routes/helpers.ts +0 -17
  457. package/src/routes/magicLinks.ts +0 -107
  458. package/src/routes/oauth.ts +0 -167
  459. package/src/routes/oauth2.ts +0 -284
  460. package/src/routes/oidcEnterprise.ts +0 -166
  461. package/src/routes/password.ts +0 -90
  462. package/src/routes/profile.ts +0 -44
  463. package/src/routes/saml.ts +0 -209
  464. package/src/routes/scim.ts +0 -199
  465. package/src/routes/sdk.ts +0 -141
  466. package/src/routes/serviceAccounts.ts +0 -124
  467. package/src/routes/sessions.ts +0 -62
  468. package/src/routes/setup.ts +0 -315
  469. package/src/routes/smsOtp.ts +0 -67
  470. package/src/routes/totp.ts +0 -122
  471. package/src/routes/webauthn.ts +0 -147
  472. package/src/routes/workflows.ts +0 -157
  473. package/src/sdk/index.ts +0 -152
  474. package/src/sdk/types.ts +0 -54
  475. package/src/services/anomalyDetection.ts +0 -73
  476. package/src/services/application/authentication.ts +0 -75
  477. package/src/services/application/identity.ts +0 -56
  478. package/src/services/application/index.ts +0 -3
  479. package/src/services/application/organization.ts +0 -77
  480. package/src/services/applications.ts +0 -89
  481. package/src/services/audit.ts +0 -41
  482. package/src/services/auditExport.ts +0 -59
  483. package/src/services/billing.ts +0 -87
  484. package/src/services/cache.ts +0 -131
  485. package/src/services/configuration/profiles.ts +0 -115
  486. package/src/services/configuration.ts +0 -120
  487. package/src/services/connectors/google.ts +0 -92
  488. package/src/services/connectors/oidc.ts +0 -111
  489. package/src/services/connectors/registry.ts +0 -124
  490. package/src/services/connectors/types.ts +0 -38
  491. package/src/services/connectors/zitadel.ts +0 -77
  492. package/src/services/devices.ts +0 -76
  493. package/src/services/domain/authentication.ts +0 -279
  494. package/src/services/domain/authorization.ts +0 -49
  495. package/src/services/domain/identity.ts +0 -108
  496. package/src/services/domain/index.ts +0 -4
  497. package/src/services/domain/organization.ts +0 -114
  498. package/src/services/email.ts +0 -167
  499. package/src/services/emailVerification.ts +0 -75
  500. package/src/services/enterpriseSso.ts +0 -58
  501. package/src/services/events/bus.ts +0 -43
  502. package/src/services/events/subscribers/anomaly.ts +0 -13
  503. package/src/services/events/subscribers/auditLog.ts +0 -21
  504. package/src/services/events/subscribers/webhook.ts +0 -39
  505. package/src/services/events/subscribers/webhookDispatch.ts +0 -14
  506. package/src/services/events/types.ts +0 -106
  507. package/src/services/events/validate.ts +0 -118
  508. package/src/services/featureFlags.ts +0 -90
  509. package/src/services/features.ts +0 -22
  510. package/src/services/federation.ts +0 -30
  511. package/src/services/hibp.ts +0 -28
  512. package/src/services/ipControls.ts +0 -99
  513. package/src/services/magicLinks.ts +0 -51
  514. package/src/services/oauth2.ts +0 -216
  515. package/src/services/organizations.ts +0 -171
  516. package/src/services/permissions.ts +0 -146
  517. package/src/services/plugins/registry.ts +0 -242
  518. package/src/services/plugins/types.ts +0 -98
  519. package/src/services/queue/bullmq.ts +0 -104
  520. package/src/services/queue/inProcess.ts +0 -75
  521. package/src/services/queue/index.ts +0 -19
  522. package/src/services/queue/types.ts +0 -26
  523. package/src/services/redis.ts +0 -16
  524. package/src/services/secrets/awsKms.ts +0 -97
  525. package/src/services/secrets/azureKeyVault.ts +0 -171
  526. package/src/services/secrets/database.ts +0 -166
  527. package/src/services/secrets/environment.ts +0 -117
  528. package/src/services/secrets/index.ts +0 -50
  529. package/src/services/secrets/password.ts +0 -73
  530. package/src/services/secrets/provider.ts +0 -36
  531. package/src/services/secrets/vault.ts +0 -149
  532. package/src/services/secrets.ts +0 -2
  533. package/src/services/serviceAccounts.ts +0 -74
  534. package/src/services/setup/configWriter.ts +0 -200
  535. package/src/services/setup/diagnostics.ts +0 -76
  536. package/src/services/setup/token.ts +0 -42
  537. package/src/services/setup/types.ts +0 -40
  538. package/src/services/setup/validation.ts +0 -205
  539. package/src/services/sms.ts +0 -81
  540. package/src/services/smsOtp.ts +0 -74
  541. package/src/services/tokens.ts +0 -287
  542. package/src/services/totp.ts +0 -113
  543. package/src/services/users.ts +0 -239
  544. package/src/services/webauthn.ts +0 -193
  545. package/src/services/webhooks.ts +0 -190
  546. package/src/services/workflows/engine.ts +0 -125
  547. package/src/services/workflows/steps.ts +0 -129
  548. package/src/services/zitadel.ts +0 -277
  549. package/src/setup-server.ts +0 -71
  550. package/src/tests/errors.test.ts +0 -74
  551. package/src/tests/events.test.ts +0 -52
  552. package/src/tests/featureFlags.test.ts +0 -26
  553. package/src/tests/integration/queue.test.ts +0 -54
  554. package/src/tests/plugins.test.ts +0 -73
  555. package/src/tests/result.test.ts +0 -52
  556. package/src/tests/setup/configWriter.test.ts +0 -69
  557. package/src/tests/setup/validation.test.ts +0 -29
  558. package/src/tests/smoke.test.ts +0 -136
  559. package/src/types.ts +0 -70
@@ -1,279 +0,0 @@
1
- import crypto from "node:crypto";
2
- import { eq, and, gt, isNull } from "drizzle-orm";
3
- import { config, isZitadelConfigured } from "../../config.js";
4
- import { db } from "../../db/index.js";
5
- import { users, passwordResetTokens, type User } from "../../db/schema.js";
6
- import { createHumanUser, verifyPassword as verifyZitadelPassword } from "../zitadel.js";
7
- import { createTokenSet, rotateRefreshToken, revokeRefreshToken, type TokenSet } from "../tokens.js";
8
- import { isPasswordBreached } from "../hibp.js";
9
- import { recordFailedLogin, isFailedLoginAnomaly } from "../anomalyDetection.js";
10
- import { emit } from "../events/bus.js";
11
- import type { UserRepository, ApplicationRepository } from "../../repositories/types.js";
12
- import { ok, err, type Result } from "../../lib/result.js";
13
- import { hashPassword, verifyPassword } from "../secrets/index.js";
14
-
15
- export interface AuthContext {
16
- app?: { id: string; clientId: string; orgId: string };
17
- org?: { id: string };
18
- }
19
-
20
- export interface RegisterInput {
21
- username: string;
22
- email: string;
23
- password: string;
24
- name?: string;
25
- clientId?: string;
26
- metadata?: Record<string, unknown>;
27
- }
28
-
29
- export interface LoginInput {
30
- email: string;
31
- password: string;
32
- clientId?: string;
33
- }
34
-
35
- export interface TokenResponse {
36
- user: User;
37
- tokens: TokenSet;
38
- context: AuthContext;
39
- }
40
-
41
- export class AuthenticationDomainService {
42
- constructor(
43
- private readonly users: UserRepository,
44
- private readonly applications: ApplicationRepository
45
- ) {}
46
-
47
- private async loadAppContext(clientId?: string): Promise<AuthContext> {
48
- if (!clientId) return {};
49
- const app = await this.applications.findByClientId(clientId);
50
- if (!app) return {};
51
- return {
52
- app: { id: app.id, clientId: app.clientId, orgId: app.orgId },
53
- org: { id: app.orgId },
54
- };
55
- }
56
-
57
- async register(input: RegisterInput): Promise<Result<TokenResponse>> {
58
- if (config.HIBP_CHECK_ENABLED) {
59
- const breached = await isPasswordBreached(input.password);
60
- if (breached) {
61
- return err({ code: "BREACHED_PASSWORD", message: "This password has appeared in a data breach.", statusCode: 400 });
62
- }
63
- }
64
-
65
- const existing = await this.users.findByEmail(input.email);
66
- if (existing) {
67
- return err({ code: "EMAIL_EXISTS", message: "An account with this email already exists.", statusCode: 409 });
68
- }
69
-
70
- const passwordHash = await hashPassword(input.password);
71
- const username = await this.users.ensureUniqueUsername(
72
- input.username.toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32)
73
- );
74
-
75
- let zitadelUserId: string | undefined;
76
- if (isZitadelConfigured()) {
77
- try {
78
- zitadelUserId = await createHumanUser({
79
- username: input.username,
80
- email: input.email,
81
- name: input.name || input.username,
82
- password: input.password,
83
- });
84
- } catch (err) {
85
- console.warn("Zitadel user mirror failed; continuing with local user", err);
86
- }
87
- }
88
-
89
- const user = await this.users.create({
90
- email: input.email,
91
- username,
92
- name: input.name || input.username,
93
- passwordHash,
94
- provider: "password",
95
- emailVerified: !config.EMAIL_VERIFICATION_REQUIRED,
96
- zitadelUserId,
97
- metadata: input.metadata,
98
- });
99
-
100
- if (config.EMAIL_VERIFICATION_REQUIRED) {
101
- try {
102
- const { sendVerificationEmail } = await import("../emailVerification.js");
103
- sendVerificationEmail(user).catch((err: unknown) => {
104
- console.error("[auth] failed to send verification email:", err);
105
- });
106
- } catch {
107
- // emailVerification module may not be available in all configurations
108
- }
109
- }
110
-
111
- const context = await this.loadAppContext(input.clientId);
112
- const tokens = await createTokenSet(user, undefined, undefined, {
113
- appId: context.app?.id,
114
- orgId: context.org?.id,
115
- clientId: context.app?.clientId,
116
- });
117
-
118
- await emit({
119
- type: "user_registered",
120
- payload: {
121
- provider: "password",
122
- zitadelUserId,
123
- userId: user.id,
124
- username: user.username,
125
- email: user.email,
126
- client_id: input.clientId,
127
- appId: context.app?.id,
128
- orgId: context.org?.id,
129
- },
130
- });
131
-
132
- return ok({ user, tokens, context });
133
- }
134
-
135
- async login(input: LoginInput): Promise<Result<TokenResponse>> {
136
- const user = await this.users.findByEmail(input.email);
137
-
138
- if (!user) {
139
- if (isZitadelConfigured()) {
140
- await verifyZitadelPassword(input.email, input.password).catch(() => {});
141
- }
142
- await recordFailedLogin(input.email);
143
- await emit({ type: "user_login_failed", payload: { reason: "unknown_user" } });
144
- if (await isFailedLoginAnomaly(input.email)) {
145
- return err({ code: "TOO_MANY_ATTEMPTS", message: "Too many failed attempts. Please try again later.", statusCode: 429 });
146
- }
147
- return err({ code: "INVALID_CREDENTIALS", message: "Invalid email or password.", statusCode: 401 });
148
- }
149
-
150
- if (user.lockedUntil && user.lockedUntil > new Date()) {
151
- await emit({ type: "user_login_failed", payload: { reason: "account_locked", userId: user.id } });
152
- return err({ code: "ACCOUNT_LOCKED", message: "Account is temporarily locked due to too many failed attempts. Try again later.", statusCode: 403 });
153
- }
154
-
155
- let valid = false;
156
- if (user.passwordHash) {
157
- valid = await verifyPassword(input.password, user.passwordHash);
158
- } else if (user.provider === "zitadel" && isZitadelConfigured()) {
159
- valid = await verifyZitadelPassword(input.email, input.password);
160
- }
161
-
162
- if (!valid) {
163
- const updated = await this.users.recordFailedLogin(user.id);
164
- await emit({ type: "user_login_failed", payload: { reason: "invalid_password", userId: user.id } });
165
-
166
- const attempts = updated?.failedLoginAttempts ?? 0;
167
- if (attempts >= config.ACCOUNT_LOCKOUT_THRESHOLD) {
168
- const lockedUntil = new Date(Date.now() + config.ACCOUNT_LOCKOUT_DURATION_SECONDS * 1000);
169
- await this.users.lockAccount(user.id, lockedUntil);
170
- return err({ code: "ACCOUNT_LOCKED", message: "Account locked due to too many failed attempts. Try again later.", statusCode: 403 });
171
- }
172
-
173
- if (await isFailedLoginAnomaly(user.id)) {
174
- return err({ code: "TOO_MANY_ATTEMPTS", message: "Too many failed attempts. Please try again later.", statusCode: 429 });
175
- }
176
- return err({ code: "INVALID_CREDENTIALS", message: "Invalid email or password.", statusCode: 401 });
177
- }
178
-
179
- await this.users.resetFailedLogins(user.id);
180
- await this.users.updateLastSeen(user.id);
181
- const context = await this.loadAppContext(input.clientId);
182
- const tokens = await createTokenSet(user, undefined, undefined, {
183
- appId: context.app?.id,
184
- orgId: context.org?.id,
185
- clientId: context.app?.clientId,
186
- });
187
-
188
- await emit({
189
- type: "user_login",
190
- payload: { provider: user.provider, userId: user.id, appId: context.app?.id, orgId: context.org?.id },
191
- });
192
-
193
- return ok({ user, tokens, context });
194
- }
195
-
196
- async refresh(refreshToken: string, clientId?: string): Promise<Result<{ tokens: TokenSet; userId?: string }>> {
197
- const tokens = await rotateRefreshToken(refreshToken, undefined, undefined);
198
- if (!tokens) {
199
- await emit({ type: "token_refresh_failed", payload: { reason: "invalid_refresh_token" } });
200
- return err({ code: "INVALID_REFRESH_TOKEN", message: "Invalid or expired session.", statusCode: 401 });
201
- }
202
-
203
- await emit({ type: "token_refresh", payload: {} });
204
- return ok({ tokens, userId: undefined });
205
- }
206
-
207
- async logout(refreshToken?: string): Promise<Result<void>> {
208
- if (refreshToken) {
209
- await revokeRefreshToken(refreshToken);
210
- }
211
- return ok(undefined);
212
- }
213
-
214
- async createPasswordResetToken(email: string): Promise<Result<{ token: string; user: User } | null>> {
215
- const user = await this.users.findByEmail(email);
216
- if (!user) return ok(null);
217
-
218
- const token = crypto.randomBytes(48).toString("base64url");
219
- const tokenHash = crypto.createHash("sha256").update(token).digest("hex");
220
- const expiresAt = new Date(Date.now() + 60 * 60 * 1000); // 1 hour
221
-
222
- await db.insert(passwordResetTokens).values({
223
- userId: user.id,
224
- tokenHash,
225
- expiresAt,
226
- });
227
-
228
- await emit({ type: "password_reset_requested", payload: { userId: user.id } });
229
- return ok({ token, user });
230
- }
231
-
232
- async resetPasswordWithToken(token: string, newPassword: string): Promise<Result<User>> {
233
- const tokenHash = crypto.createHash("sha256").update(token).digest("hex");
234
- const now = new Date();
235
-
236
- const [record] = await db
237
- .select()
238
- .from(passwordResetTokens)
239
- .where(
240
- and(
241
- eq(passwordResetTokens.tokenHash, tokenHash),
242
- gt(passwordResetTokens.expiresAt, now),
243
- isNull(passwordResetTokens.usedAt)
244
- )
245
- )
246
- .limit(1);
247
-
248
- if (!record) {
249
- return err({ code: "INVALID_TOKEN", message: "Invalid or expired reset token.", statusCode: 400 });
250
- }
251
-
252
- const user = await this.users.findById(record.userId);
253
- if (!user) {
254
- return err({ code: "USER_NOT_FOUND", message: "User not found.", statusCode: 400 });
255
- }
256
-
257
- if (config.HIBP_CHECK_ENABLED) {
258
- const breached = await isPasswordBreached(newPassword);
259
- if (breached) {
260
- return err({ code: "BREACHED_PASSWORD", message: "This password has appeared in a data breach.", statusCode: 400 });
261
- }
262
- }
263
-
264
- const passwordHash = await hashPassword(newPassword);
265
- await db.transaction(async (tx) => {
266
- await tx
267
- .update(passwordResetTokens)
268
- .set({ usedAt: now })
269
- .where(eq(passwordResetTokens.id, record.id));
270
- await tx
271
- .update(users)
272
- .set({ passwordHash, updatedAt: now })
273
- .where(eq(users.id, user.id));
274
- });
275
-
276
- await emit({ type: "password_reset_completed", payload: { userId: user.id } });
277
- return ok(user);
278
- }
279
- }
@@ -1,49 +0,0 @@
1
- import type { OrgMembership } from "../../db/schema.js";
2
- import type { OrganizationRepository, PermissionRepository } from "../../repositories/types.js";
3
- import { ok, err, type Result } from "../../lib/result.js";
4
-
5
- export interface PermissionInput {
6
- resource: string;
7
- action: string;
8
- }
9
-
10
- export { type PermissionInput as PermissionRequirement };
11
- export type OrgRole = "owner" | "admin" | "member";
12
-
13
- export class AuthorizationDomainService {
14
- constructor(
15
- private readonly organizations: OrganizationRepository,
16
- private readonly permissions: PermissionRepository
17
- ) {}
18
-
19
- async requirePermission(role: string, resource: string, action: string): Promise<Result<void>> {
20
- const allowed = await this.permissions.hasPermission(role, resource, action);
21
- if (!allowed) {
22
- return err({ code: "FORBIDDEN", message: `Missing permission ${resource}:${action}`, statusCode: 403 });
23
- }
24
- return ok(undefined);
25
- }
26
-
27
- async hasPermission(role: string, resource: string, action: string): Promise<boolean> {
28
- return this.permissions.hasPermission(role, resource, action);
29
- }
30
-
31
- async hasAnyPermission(role: string, required: PermissionInput[]): Promise<boolean> {
32
- return this.permissions.hasAnyPermission(role, required);
33
- }
34
-
35
- async requireOrgRole(userId: string, orgId: string, allowedRoles: OrgRole[]): Promise<Result<OrgMembership>> {
36
- const membership = await this.organizations.findMembership(orgId, userId);
37
- if (!membership) {
38
- return err({ code: "NOT_MEMBER", message: "Not a member of this organization", statusCode: 403 });
39
- }
40
- if (!allowedRoles.includes(membership.role as OrgRole)) {
41
- return err({ code: "INSUFFICIENT_ROLE", message: "Insufficient organization permissions", statusCode: 403 });
42
- }
43
- return ok(membership);
44
- }
45
-
46
- async isOrgMember(userId: string, orgId: string): Promise<OrgMembership | undefined> {
47
- return this.organizations.findMembership(orgId, userId);
48
- }
49
- }
@@ -1,108 +0,0 @@
1
- import type { User } from "../../db/schema.js";
2
- import type { UserRepository, IdentityRepository } from "../../repositories/types.js";
3
- import type { TokenSet } from "../tokens.js";
4
- import { createTokenSet } from "../tokens.js";
5
- import { emit } from "../events/bus.js";
6
- import { getFederationAuthorizeUrl as getFederationAuthorizeUrlService, completeFederationLogin as completeFederationLoginService } from "../federation.js";
7
- import { ok, err, type Result } from "../../lib/result.js";
8
-
9
- export class IdentityDomainService {
10
- constructor(
11
- private readonly users: UserRepository,
12
- private readonly identities: IdentityRepository
13
- ) {}
14
-
15
- async findUser(id: string): Promise<Result<User>> {
16
- const user = await this.users.findById(id);
17
- if (!user) return err({ code: "USER_NOT_FOUND", message: "User not found", statusCode: 404 });
18
- return ok(user);
19
- }
20
-
21
- async findUserByEmail(email: string): Promise<Result<User>> {
22
- const user = await this.users.findByEmail(email);
23
- if (!user) return err({ code: "USER_NOT_FOUND", message: "User not found", statusCode: 404 });
24
- return ok(user);
25
- }
26
-
27
- async upsertInvitedUser(input: { email: string; name?: string; username?: string }): Promise<Result<User>> {
28
- const existing = await this.users.findByEmail(input.email);
29
- if (existing) return ok(existing);
30
-
31
- const baseUsername = input.username || input.email.split("@")[0];
32
- const username = await this.users.ensureUniqueUsername(
33
- baseUsername.toLowerCase().trim().replace(/[^a-z0-9_-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32)
34
- );
35
-
36
- const user = await this.users.create({
37
- email: input.email,
38
- username,
39
- name: input.name || username,
40
- provider: "password",
41
- emailVerified: false,
42
- });
43
- return ok(user);
44
- }
45
-
46
- async updateUserProfile(
47
- userId: string,
48
- updates: Partial<{ name: string; username: string; role: string; emailVerified: boolean }>
49
- ): Promise<Result<User>> {
50
- const updated = await this.users.update(userId, updates);
51
- if (!updated) return err({ code: "USER_NOT_FOUND", message: "User not found", statusCode: 404 });
52
- return ok(updated);
53
- }
54
-
55
- async deactivate(userId: string): Promise<Result<void>> {
56
- await this.users.deactivate(userId);
57
- return ok(undefined);
58
- }
59
-
60
- async listOrganizationUsers(orgId: string): Promise<User[]> {
61
- return this.users.listByOrg(orgId);
62
- }
63
-
64
- async touchLastSeen(userId: string): Promise<void> {
65
- await this.users.updateLastSeen(userId);
66
- }
67
-
68
- async linkUserIdentity(
69
- userId: string,
70
- providerId: string,
71
- providerType: string,
72
- externalSub: string,
73
- email?: string
74
- ): Promise<Result<void>> {
75
- await this.identities.link({ userId, providerId, providerType, externalSub, email });
76
- return ok(undefined);
77
- }
78
-
79
- async getFederationAuthorizeUrl(provider: string, state: string, redirectUri: string): Promise<Result<{ url: string }>> {
80
- const url = await getFederationAuthorizeUrlService(provider, state, redirectUri);
81
- return ok({ url });
82
- }
83
-
84
- async completeFederationLogin(
85
- provider: string,
86
- code: string,
87
- redirectUri: string
88
- ): Promise<Result<{ user: User; tokens: { accessToken: string; refreshToken: string } }>> {
89
- const result = await completeFederationLoginService(provider, code, redirectUri);
90
- await emit({
91
- type: "federation_login",
92
- payload: { provider, userId: result.user.id, email: result.user.email },
93
- });
94
- return ok(result);
95
- }
96
-
97
- async issueLocalTokenSet(
98
- user: User,
99
- opts?: {
100
- appId?: string;
101
- orgId?: string;
102
- clientId?: string;
103
- deviceFingerprint?: string;
104
- }
105
- ): Promise<TokenSet> {
106
- return createTokenSet(user, undefined, undefined, opts, opts?.deviceFingerprint);
107
- }
108
- }
@@ -1,4 +0,0 @@
1
- export { AuthenticationDomainService } from "./authentication.js";
2
- export { AuthorizationDomainService } from "./authorization.js";
3
- export { IdentityDomainService } from "./identity.js";
4
- export { OrganizationDomainService } from "./organization.js";
@@ -1,114 +0,0 @@
1
- import type { Organization, Application, OrgMembership } from "../../db/schema.js";
2
- import type { OrganizationRepository, ApplicationRepository, UserRepository } from "../../repositories/types.js";
3
- import { emit } from "../events/bus.js";
4
- import { ok, err, type Result } from "../../lib/result.js";
5
-
6
- export type OrgRole = "owner" | "admin" | "member";
7
-
8
- export class OrganizationDomainService {
9
- constructor(
10
- private readonly organizations: OrganizationRepository,
11
- private readonly applications: ApplicationRepository,
12
- private readonly users?: UserRepository
13
- ) {}
14
-
15
- async createOrganization(
16
- input: { name: string; slug?: string; plan?: string },
17
- userId?: string
18
- ): Promise<Result<Organization>> {
19
- const org = await this.organizations.create(input);
20
- if (userId) {
21
- await this.organizations.addMembership({ orgId: org.id, userId, role: "owner" });
22
- }
23
- return ok(org);
24
- }
25
-
26
- async getOrganization(id: string): Promise<Result<Organization>> {
27
- const org = await this.organizations.findById(id);
28
- if (!org) return err({ code: "ORG_NOT_FOUND", message: "Organization not found", statusCode: 404 });
29
- return ok(org);
30
- }
31
-
32
- async listUserOrganizations(userId: string): Promise<Organization[]> {
33
- return this.organizations.listByUserId(userId);
34
- }
35
-
36
- async addOrgMembership(input: { orgId: string; userId: string; role: OrgRole }): Promise<Result<OrgMembership>> {
37
- const membership = await this.organizations.addMembership(input);
38
- return ok(membership);
39
- }
40
-
41
- async getMembership(orgId: string, userId: string): Promise<Result<OrgMembership>> {
42
- const membership = await this.organizations.findMembership(orgId, userId);
43
- if (!membership) return err({ code: "MEMBERSHIP_NOT_FOUND", message: "Membership not found", statusCode: 404 });
44
- return ok(membership);
45
- }
46
-
47
- async updateMembershipRole(
48
- orgId: string,
49
- userId: string,
50
- role: OrgRole
51
- ): Promise<Result<OrgMembership>> {
52
- const updated = await this.organizations.updateMembershipRole(orgId, userId, role);
53
- if (!updated) return err({ code: "MEMBERSHIP_NOT_FOUND", message: "Membership not found", statusCode: 404 });
54
- return ok(updated);
55
- }
56
-
57
- async removeMembership(orgId: string, userId: string): Promise<Result<boolean>> {
58
- return ok(await this.organizations.removeMembership(orgId, userId));
59
- }
60
-
61
- async removeOrgMember(orgId: string, userId: string): Promise<Result<{ success: boolean }>> {
62
- const membership = await this.organizations.findMembership(orgId, userId);
63
- if (!membership) return err({ code: "MEMBERSHIP_NOT_FOUND", message: "Membership not found", statusCode: 404 });
64
-
65
- if (membership.role === "owner" && (await this.organizations.countOwners(orgId)) <= 1) {
66
- return err({ code: "LAST_OWNER", message: "Cannot remove the last owner", statusCode: 400 });
67
- }
68
-
69
- await this.organizations.removeMembership(orgId, userId);
70
- return ok({ success: true });
71
- }
72
-
73
- async deactivateOrgUser(orgId: string, userId: string): Promise<Result<{ success: boolean }>> {
74
- const membership = await this.organizations.findMembership(orgId, userId);
75
- if (!membership) {
76
- return err({ code: "MEMBERSHIP_NOT_FOUND", message: "User is not a member of this organization", statusCode: 404 });
77
- }
78
- if (this.users) {
79
- await this.users.deactivate(userId);
80
- }
81
- await this.organizations.removeMembership(orgId, userId);
82
- return ok({ success: true });
83
- }
84
-
85
- async listOrgMembers(orgId: string) {
86
- return this.organizations.listMembers(orgId);
87
- }
88
-
89
- async createApplication(input: {
90
- orgId: string;
91
- name: string;
92
- redirectUris?: string[];
93
- allowedOrigins?: string[];
94
- }): Promise<Result<Application & { clientSecret: string }>> {
95
- const app = await this.applications.create(input);
96
- await emit({ type: "application_created", payload: { orgId: input.orgId, appId: app.id } });
97
- return ok(app);
98
- }
99
-
100
- async listOrganizationApplications(orgId: string): Promise<Application[]> {
101
- return this.applications.listByOrgId(orgId);
102
- }
103
-
104
- async updateApplication(
105
- appId: string,
106
- orgId: string,
107
- updates: Partial<{ name: string; redirectUris: string[]; allowedOrigins: string[]; allowedIps: string[]; blockedIps: string[]; isActive: boolean; branding: Record<string, unknown> }>
108
- ): Promise<Result<Application>> {
109
- const updated = await this.applications.update(appId, orgId, updates);
110
- if (!updated) return err({ code: "APP_NOT_FOUND", message: "Application not found", statusCode: 404 });
111
- await emit({ type: "application_updated", payload: { orgId, appId: updated.id } });
112
- return ok(updated);
113
- }
114
- }