sa2kit 2.0.4 → 3.1.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 (354) hide show
  1. package/dist/{UniversalFileService-GsP6D3Rc.d.ts → UniversalFileService-CC4d3wkc.d.ts} +2 -2
  2. package/dist/{UniversalFileService-BpvbZitV.d.mts → UniversalFileService-CzAE_G4V.d.mts} +2 -2
  3. package/dist/ai/llm/ui/miniapp/index.d.mts +2 -2
  4. package/dist/ai/llm/ui/miniapp/index.d.ts +2 -2
  5. package/dist/ai/llm/ui/rn/index.d.mts +2 -2
  6. package/dist/ai/llm/ui/rn/index.d.ts +2 -2
  7. package/dist/ai/llm/ui/web/index.d.mts +3 -3
  8. package/dist/ai/llm/ui/web/index.d.ts +3 -3
  9. package/dist/analytics/index.d.mts +1 -1
  10. package/dist/analytics/index.d.ts +1 -1
  11. package/dist/business/index.d.mts +1 -5
  12. package/dist/business/index.d.ts +1 -5
  13. package/dist/business/index.js +34 -1135
  14. package/dist/business/index.js.map +1 -1
  15. package/dist/business/index.mjs +5 -1105
  16. package/dist/business/index.mjs.map +1 -1
  17. package/dist/calendar/routes/index.d.mts +74 -1
  18. package/dist/calendar/routes/index.d.ts +74 -1
  19. package/dist/calendar/routes/index.js +186 -97
  20. package/dist/calendar/routes/index.js.map +1 -1
  21. package/dist/calendar/routes/index.mjs +178 -99
  22. package/dist/calendar/routes/index.mjs.map +1 -1
  23. package/dist/{chunk-RJP2BRJD.mjs → chunk-4OOANEJV.mjs} +2 -2
  24. package/dist/{chunk-RJP2BRJD.mjs.map → chunk-4OOANEJV.mjs.map} +1 -1
  25. package/dist/chunk-5FUAQLGC.mjs +14 -0
  26. package/dist/chunk-5FUAQLGC.mjs.map +1 -0
  27. package/dist/{chunk-IIVNHQEI.mjs → chunk-5GBDDXYL.mjs} +4 -3
  28. package/dist/chunk-5GBDDXYL.mjs.map +1 -0
  29. package/dist/{chunk-S732H246.js → chunk-6PMXAK7F.js} +2 -2
  30. package/dist/{chunk-S732H246.js.map → chunk-6PMXAK7F.js.map} +1 -1
  31. package/dist/chunk-6YLCRWKM.mjs +8 -0
  32. package/dist/chunk-6YLCRWKM.mjs.map +1 -0
  33. package/dist/chunk-CAYOQDBR.js +78 -0
  34. package/dist/chunk-CAYOQDBR.js.map +1 -0
  35. package/dist/{chunk-PTMSDNGO.mjs → chunk-CX2GHCAI.mjs} +4 -75
  36. package/dist/chunk-CX2GHCAI.mjs.map +1 -0
  37. package/dist/chunk-EBHPTFG6.mjs +82 -0
  38. package/dist/chunk-EBHPTFG6.mjs.map +1 -0
  39. package/dist/chunk-HQLKOXG7.js +16 -0
  40. package/dist/chunk-HQLKOXG7.js.map +1 -0
  41. package/dist/chunk-IS7O4LPI.js +146 -0
  42. package/dist/chunk-IS7O4LPI.js.map +1 -0
  43. package/dist/chunk-LGHUCQIU.js +93 -0
  44. package/dist/chunk-LGHUCQIU.js.map +1 -0
  45. package/dist/chunk-LKBIVQBT.mjs +34 -0
  46. package/dist/chunk-LKBIVQBT.mjs.map +1 -0
  47. package/dist/chunk-MIDXG6LS.js +32 -0
  48. package/dist/chunk-MIDXG6LS.js.map +1 -0
  49. package/dist/chunk-NDGHXVGS.js +25 -0
  50. package/dist/chunk-NDGHXVGS.js.map +1 -0
  51. package/dist/chunk-PA4ELVGI.js +20 -0
  52. package/dist/chunk-PA4ELVGI.js.map +1 -0
  53. package/dist/chunk-Q5VFBPMG.mjs +76 -0
  54. package/dist/chunk-Q5VFBPMG.mjs.map +1 -0
  55. package/dist/{chunk-WZDTNDYR.js → chunk-QSKLQX6H.js} +11 -11
  56. package/dist/{chunk-WZDTNDYR.js.map → chunk-QSKLQX6H.js.map} +1 -1
  57. package/dist/{chunk-QQ2WFYOD.js → chunk-S6YSGVWD.js} +4 -76
  58. package/dist/chunk-S6YSGVWD.js.map +1 -0
  59. package/dist/chunk-TNJ6LYX7.mjs +18 -0
  60. package/dist/chunk-TNJ6LYX7.mjs.map +1 -0
  61. package/dist/chunk-TTYCVBIQ.mjs +144 -0
  62. package/dist/chunk-TTYCVBIQ.mjs.map +1 -0
  63. package/dist/chunk-VJNDOYEC.js +41 -0
  64. package/dist/chunk-VJNDOYEC.js.map +1 -0
  65. package/dist/{chunk-J77KR2EV.mjs → chunk-WJ7IMUEJ.mjs} +3 -3
  66. package/dist/{chunk-J77KR2EV.mjs.map → chunk-WJ7IMUEJ.mjs.map} +1 -1
  67. package/dist/chunk-YTGUIRRH.js +10 -0
  68. package/dist/chunk-YTGUIRRH.js.map +1 -0
  69. package/dist/chunk-ZF7DKR5A.mjs +26 -0
  70. package/dist/chunk-ZF7DKR5A.mjs.map +1 -0
  71. package/dist/common/auth/client/index.d.mts +3209 -0
  72. package/dist/common/auth/client/index.d.ts +3209 -0
  73. package/dist/common/auth/client/index.js +13 -0
  74. package/dist/common/auth/client/index.mjs +4 -0
  75. package/dist/common/auth/components/index.d.mts +140 -0
  76. package/dist/common/auth/components/index.d.ts +140 -0
  77. package/dist/common/auth/components/index.js +899 -0
  78. package/dist/common/auth/components/index.js.map +1 -0
  79. package/dist/common/auth/components/index.mjs +875 -0
  80. package/dist/common/auth/components/index.mjs.map +1 -0
  81. package/dist/common/auth/hooks/index.d.mts +48 -0
  82. package/dist/common/auth/hooks/index.d.ts +48 -0
  83. package/dist/common/auth/hooks/index.js +19 -0
  84. package/dist/common/auth/hooks/index.mjs +6 -0
  85. package/dist/common/auth/index.d.mts +11 -7
  86. package/dist/common/auth/index.d.ts +11 -7
  87. package/dist/common/auth/index.js +7 -19
  88. package/dist/common/auth/index.mjs +3 -3
  89. package/dist/common/auth/react/index.d.mts +3056 -0
  90. package/dist/common/auth/react/index.d.ts +3056 -0
  91. package/dist/common/auth/react/index.js +31 -0
  92. package/dist/common/auth/react/index.js.map +1 -0
  93. package/dist/common/auth/react/index.mjs +21 -0
  94. package/dist/common/auth/react/index.mjs.map +1 -0
  95. package/dist/common/auth/rn/index.d.mts +3122 -0
  96. package/dist/common/auth/rn/index.d.ts +3122 -0
  97. package/dist/common/auth/rn/index.js +316 -0
  98. package/dist/common/auth/rn/index.js.map +1 -0
  99. package/dist/common/auth/rn/index.mjs +298 -0
  100. package/dist/common/auth/rn/index.mjs.map +1 -0
  101. package/dist/common/auth/schema/index.d.mts +1479 -0
  102. package/dist/common/auth/schema/index.d.ts +1479 -0
  103. package/dist/common/auth/schema/index.js +49 -0
  104. package/dist/common/auth/schema/index.mjs +4 -0
  105. package/dist/common/auth/server/index.d.mts +81 -25
  106. package/dist/common/auth/server/index.d.ts +81 -25
  107. package/dist/common/auth/server/index.js +146 -98
  108. package/dist/common/auth/server/index.js.map +1 -1
  109. package/dist/common/auth/server/index.mjs +125 -5
  110. package/dist/common/auth/server/index.mjs.map +1 -1
  111. package/dist/common/auth/services/index.d.mts +14 -0
  112. package/dist/common/auth/services/index.d.ts +14 -0
  113. package/dist/common/auth/services/index.js +20 -0
  114. package/dist/common/auth/services/index.js.map +1 -0
  115. package/dist/common/auth/services/index.mjs +13 -0
  116. package/dist/common/auth/services/index.mjs.map +1 -0
  117. package/dist/common/file/server/index.js +32 -32
  118. package/dist/common/file/server/index.mjs +3 -3
  119. package/dist/common/index.d.mts +13 -8
  120. package/dist/common/index.d.ts +13 -8
  121. package/dist/common/index.js +19 -18
  122. package/dist/common/index.mjs +8 -7
  123. package/dist/common/storage/index.js +13 -12
  124. package/dist/common/storage/index.mjs +3 -2
  125. package/dist/festivalCard/index.d.mts +3 -3
  126. package/dist/festivalCard/index.d.ts +3 -3
  127. package/dist/festivalCard/routes/index.d.mts +1 -1
  128. package/dist/festivalCard/routes/index.d.ts +1 -1
  129. package/dist/festivalCard/server/index.d.mts +2 -2
  130. package/dist/festivalCard/server/index.d.ts +2 -2
  131. package/dist/{festivalCardService-BFCRhJrq.d.ts → festivalCardService-B3GsnNpV.d.ts} +1 -1
  132. package/dist/{festivalCardService-GriR2VMc.d.mts → festivalCardService-CWhrLNE9.d.mts} +1 -1
  133. package/dist/i18n/index.d.mts +1 -1
  134. package/dist/i18n/index.d.ts +1 -1
  135. package/dist/imageCrop/index.d.mts +3 -3
  136. package/dist/imageCrop/index.d.ts +3 -3
  137. package/dist/index-Bd7cKF1j.d.mts +50 -0
  138. package/dist/{index-CLB80GCP.d.mts → index-D0cqaQEH.d.mts} +5 -5
  139. package/dist/{index-CLB80GCP.d.ts → index-D0cqaQEH.d.ts} +5 -5
  140. package/dist/index-DRQxtCDw.d.ts +50 -0
  141. package/dist/{index-1Ag7IBXN.d.ts → index-DZ5iJtNO.d.mts} +2 -44
  142. package/dist/{index-DdeZSeTJ.d.mts → index-DZ5iJtNO.d.ts} +2 -44
  143. package/dist/{index-BxZauNN_.d.ts → index-DoUo8IrU.d.mts} +8 -8
  144. package/dist/{index-BxZauNN_.d.mts → index-DoUo8IrU.d.ts} +8 -8
  145. package/dist/index.d.mts +6382 -105
  146. package/dist/index.d.ts +6382 -105
  147. package/dist/index.js +1037 -2616
  148. package/dist/index.js.map +1 -1
  149. package/dist/index.mjs +976 -2555
  150. package/dist/index.mjs.map +1 -1
  151. package/dist/mmd/admin/index.d.mts +1 -1
  152. package/dist/mmd/admin/index.d.ts +1 -1
  153. package/dist/mmd/index.d.mts +1 -1
  154. package/dist/mmd/index.d.ts +1 -1
  155. package/dist/mmd/server/index.d.mts +3 -3
  156. package/dist/mmd/server/index.d.ts +3 -3
  157. package/dist/ossFile/server/index.js +32 -32
  158. package/dist/ossFile/server/index.mjs +3 -3
  159. package/dist/storage/index.js +12 -11
  160. package/dist/storage/index.mjs +2 -1
  161. package/dist/{types-DyG3ZV9V.d.mts → types-B6B210gX.d.mts} +1 -1
  162. package/dist/{types-DyG3ZV9V.d.ts → types-B6B210gX.d.ts} +1 -1
  163. package/dist/{types-BTiaMsBz.d.mts → types-Bdnte5EN.d.mts} +1 -1
  164. package/dist/{types-tQfupO6d.d.ts → types-Cs0CLvrH.d.mts} +1 -1
  165. package/dist/{types-tQfupO6d.d.mts → types-Cs0CLvrH.d.ts} +1 -1
  166. package/dist/{types-ERmJyjx8.d.ts → types-_rFX1atk.d.ts} +1 -1
  167. package/dist/universalExport/index.d.mts +3 -3
  168. package/dist/universalExport/index.d.ts +3 -3
  169. package/dist/universalFile/index.d.mts +5 -5
  170. package/dist/universalFile/index.d.ts +5 -5
  171. package/dist/universalFile/server/index.js +62 -62
  172. package/dist/universalFile/server/index.mjs +2 -2
  173. package/dist/useAuthActions-7S5dL7Oh.d.mts +77 -0
  174. package/dist/useAuthActions-7S5dL7Oh.d.ts +77 -0
  175. package/dist/vocaloidBooth/server/index.d.mts +3 -3
  176. package/dist/vocaloidBooth/server/index.d.ts +3 -3
  177. package/package.json +44 -111
  178. package/dist/auth/client/index.d.mts +0 -32
  179. package/dist/auth/client/index.d.ts +0 -32
  180. package/dist/auth/client/index.js +0 -21
  181. package/dist/auth/client/index.mjs +0 -4
  182. package/dist/auth/components/index.d.mts +0 -227
  183. package/dist/auth/components/index.d.ts +0 -227
  184. package/dist/auth/components/index.js +0 -327
  185. package/dist/auth/components/index.js.map +0 -1
  186. package/dist/auth/components/index.mjs +0 -319
  187. package/dist/auth/components/index.mjs.map +0 -1
  188. package/dist/auth/hooks/index.d.mts +0 -31
  189. package/dist/auth/hooks/index.d.ts +0 -31
  190. package/dist/auth/hooks/index.js +0 -17
  191. package/dist/auth/hooks/index.mjs +0 -4
  192. package/dist/auth/index.d.mts +0 -18
  193. package/dist/auth/index.d.ts +0 -18
  194. package/dist/auth/index.js +0 -151
  195. package/dist/auth/index.mjs +0 -10
  196. package/dist/auth/legacy/core/index.d.mts +0 -42
  197. package/dist/auth/legacy/core/index.d.ts +0 -42
  198. package/dist/auth/legacy/core/index.js +0 -242
  199. package/dist/auth/legacy/core/index.js.map +0 -1
  200. package/dist/auth/legacy/core/index.mjs +0 -226
  201. package/dist/auth/legacy/core/index.mjs.map +0 -1
  202. package/dist/auth/legacy/db/index.d.mts +0 -5
  203. package/dist/auth/legacy/db/index.d.ts +0 -5
  204. package/dist/auth/legacy/db/index.js +0 -261
  205. package/dist/auth/legacy/db/index.js.map +0 -1
  206. package/dist/auth/legacy/db/index.mjs +0 -250
  207. package/dist/auth/legacy/db/index.mjs.map +0 -1
  208. package/dist/auth/legacy/index.d.mts +0 -5
  209. package/dist/auth/legacy/index.d.ts +0 -5
  210. package/dist/auth/legacy/index.js +0 -1107
  211. package/dist/auth/legacy/index.js.map +0 -1
  212. package/dist/auth/legacy/index.mjs +0 -1086
  213. package/dist/auth/legacy/index.mjs.map +0 -1
  214. package/dist/auth/legacy/logic/index.d.mts +0 -9
  215. package/dist/auth/legacy/logic/index.d.ts +0 -9
  216. package/dist/auth/legacy/logic/index.js +0 -194
  217. package/dist/auth/legacy/logic/index.js.map +0 -1
  218. package/dist/auth/legacy/logic/index.mjs +0 -187
  219. package/dist/auth/legacy/logic/index.mjs.map +0 -1
  220. package/dist/auth/legacy/miniapp/index.d.mts +0 -5
  221. package/dist/auth/legacy/miniapp/index.d.ts +0 -5
  222. package/dist/auth/legacy/miniapp/index.js +0 -506
  223. package/dist/auth/legacy/miniapp/index.js.map +0 -1
  224. package/dist/auth/legacy/miniapp/index.mjs +0 -487
  225. package/dist/auth/legacy/miniapp/index.mjs.map +0 -1
  226. package/dist/auth/legacy/routes/index.d.mts +0 -53
  227. package/dist/auth/legacy/routes/index.d.ts +0 -53
  228. package/dist/auth/legacy/routes/index.js +0 -278
  229. package/dist/auth/legacy/routes/index.js.map +0 -1
  230. package/dist/auth/legacy/routes/index.mjs +0 -271
  231. package/dist/auth/legacy/routes/index.mjs.map +0 -1
  232. package/dist/auth/legacy/schema/index.d.mts +0 -401
  233. package/dist/auth/legacy/schema/index.d.ts +0 -401
  234. package/dist/auth/legacy/schema/index.js +0 -50
  235. package/dist/auth/legacy/schema/index.js.map +0 -1
  236. package/dist/auth/legacy/schema/index.mjs +0 -44
  237. package/dist/auth/legacy/schema/index.mjs.map +0 -1
  238. package/dist/auth/legacy/server/index.d.mts +0 -13
  239. package/dist/auth/legacy/server/index.d.ts +0 -13
  240. package/dist/auth/legacy/server/index.js +0 -21
  241. package/dist/auth/legacy/server/index.js.map +0 -1
  242. package/dist/auth/legacy/server/index.mjs +0 -19
  243. package/dist/auth/legacy/server/index.mjs.map +0 -1
  244. package/dist/auth/legacy/services/index.d.mts +0 -40
  245. package/dist/auth/legacy/services/index.d.ts +0 -40
  246. package/dist/auth/legacy/services/index.js +0 -258
  247. package/dist/auth/legacy/services/index.js.map +0 -1
  248. package/dist/auth/legacy/services/index.mjs +0 -252
  249. package/dist/auth/legacy/services/index.mjs.map +0 -1
  250. package/dist/auth/legacy/ui/miniapp/index.d.mts +0 -10
  251. package/dist/auth/legacy/ui/miniapp/index.d.ts +0 -10
  252. package/dist/auth/legacy/ui/miniapp/index.js +0 -298
  253. package/dist/auth/legacy/ui/miniapp/index.js.map +0 -1
  254. package/dist/auth/legacy/ui/miniapp/index.mjs +0 -290
  255. package/dist/auth/legacy/ui/miniapp/index.mjs.map +0 -1
  256. package/dist/auth/legacy/ui/web/index.d.mts +0 -22
  257. package/dist/auth/legacy/ui/web/index.d.ts +0 -22
  258. package/dist/auth/legacy/ui/web/index.js +0 -899
  259. package/dist/auth/legacy/ui/web/index.js.map +0 -1
  260. package/dist/auth/legacy/ui/web/index.mjs +0 -889
  261. package/dist/auth/legacy/ui/web/index.mjs.map +0 -1
  262. package/dist/auth/legacy/web/index.d.mts +0 -5
  263. package/dist/auth/legacy/web/index.d.ts +0 -5
  264. package/dist/auth/legacy/web/index.js +0 -1107
  265. package/dist/auth/legacy/web/index.js.map +0 -1
  266. package/dist/auth/legacy/web/index.mjs +0 -1086
  267. package/dist/auth/legacy/web/index.mjs.map +0 -1
  268. package/dist/auth/middleware/index.d.mts +0 -75
  269. package/dist/auth/middleware/index.d.ts +0 -75
  270. package/dist/auth/middleware/index.js +0 -15
  271. package/dist/auth/middleware/index.js.map +0 -1
  272. package/dist/auth/middleware/index.mjs +0 -6
  273. package/dist/auth/middleware/index.mjs.map +0 -1
  274. package/dist/auth/rn/index.d.mts +0 -64
  275. package/dist/auth/rn/index.d.ts +0 -64
  276. package/dist/auth/rn/index.js +0 -765
  277. package/dist/auth/rn/index.js.map +0 -1
  278. package/dist/auth/rn/index.mjs +0 -754
  279. package/dist/auth/rn/index.mjs.map +0 -1
  280. package/dist/auth/routes/index.d.mts +0 -261
  281. package/dist/auth/routes/index.d.ts +0 -261
  282. package/dist/auth/routes/index.js +0 -59
  283. package/dist/auth/routes/index.js.map +0 -1
  284. package/dist/auth/routes/index.mjs +0 -6
  285. package/dist/auth/routes/index.mjs.map +0 -1
  286. package/dist/auth/schema/index.d.mts +0 -789
  287. package/dist/auth/schema/index.d.ts +0 -789
  288. package/dist/auth/schema/index.js +0 -41
  289. package/dist/auth/schema/index.js.map +0 -1
  290. package/dist/auth/schema/index.mjs +0 -4
  291. package/dist/auth/schema/index.mjs.map +0 -1
  292. package/dist/auth/services/index.d.mts +0 -48
  293. package/dist/auth/services/index.d.ts +0 -48
  294. package/dist/auth/services/index.js +0 -34
  295. package/dist/auth/services/index.js.map +0 -1
  296. package/dist/auth/services/index.mjs +0 -5
  297. package/dist/auth/services/index.mjs.map +0 -1
  298. package/dist/base-api-client-ACKKt13v.d.mts +0 -277
  299. package/dist/base-api-client-ACKKt13v.d.ts +0 -277
  300. package/dist/base-api-client-B3wZZoaH.d.ts +0 -103
  301. package/dist/base-api-client-DrL35Ea2.d.mts +0 -103
  302. package/dist/chunk-37HYTHEC.mjs +0 -90
  303. package/dist/chunk-37HYTHEC.mjs.map +0 -1
  304. package/dist/chunk-5WV35FPV.js +0 -131
  305. package/dist/chunk-5WV35FPV.js.map +0 -1
  306. package/dist/chunk-DCRD5CZB.js +0 -573
  307. package/dist/chunk-DCRD5CZB.js.map +0 -1
  308. package/dist/chunk-DDX4JKFS.js +0 -19
  309. package/dist/chunk-DDX4JKFS.js.map +0 -1
  310. package/dist/chunk-DV6M7MFP.js +0 -283
  311. package/dist/chunk-DV6M7MFP.js.map +0 -1
  312. package/dist/chunk-HBF4HPRK.js +0 -186
  313. package/dist/chunk-HBF4HPRK.js.map +0 -1
  314. package/dist/chunk-HCI6JQOU.mjs +0 -183
  315. package/dist/chunk-HCI6JQOU.mjs.map +0 -1
  316. package/dist/chunk-I44HXJ3X.mjs +0 -17
  317. package/dist/chunk-I44HXJ3X.mjs.map +0 -1
  318. package/dist/chunk-IIVNHQEI.mjs.map +0 -1
  319. package/dist/chunk-IJ4YYWE3.mjs +0 -122
  320. package/dist/chunk-IJ4YYWE3.mjs.map +0 -1
  321. package/dist/chunk-J4BEIZUC.js +0 -92
  322. package/dist/chunk-J4BEIZUC.js.map +0 -1
  323. package/dist/chunk-OKPWFVXC.js +0 -24
  324. package/dist/chunk-OKPWFVXC.js.map +0 -1
  325. package/dist/chunk-PNOTQAYK.mjs +0 -560
  326. package/dist/chunk-PNOTQAYK.mjs.map +0 -1
  327. package/dist/chunk-PTMSDNGO.mjs.map +0 -1
  328. package/dist/chunk-Q2IAL7YV.js +0 -36
  329. package/dist/chunk-Q2IAL7YV.js.map +0 -1
  330. package/dist/chunk-QQ2WFYOD.js.map +0 -1
  331. package/dist/chunk-VQ54PUQV.js +0 -216
  332. package/dist/chunk-VQ54PUQV.js.map +0 -1
  333. package/dist/chunk-W5JEGA76.mjs +0 -33
  334. package/dist/chunk-W5JEGA76.mjs.map +0 -1
  335. package/dist/chunk-YGI7UU2D.mjs +0 -212
  336. package/dist/chunk-YGI7UU2D.mjs.map +0 -1
  337. package/dist/chunk-ZCLQSI5F.mjs +0 -271
  338. package/dist/chunk-ZCLQSI5F.mjs.map +0 -1
  339. package/dist/drizzle-auth-service-D-pljzCD.d.mts +0 -145
  340. package/dist/drizzle-auth-service-D3qryE_I.d.ts +0 -145
  341. package/dist/index-Bnh6VqFv.d.ts +0 -35
  342. package/dist/index-DNKZ7-R_.d.mts +0 -184
  343. package/dist/index-DNKZ7-R_.d.ts +0 -184
  344. package/dist/index-DPYkrKZf.d.mts +0 -35
  345. package/dist/types-C5vUWf9u.d.ts +0 -70
  346. package/dist/types-C_W_CoUD.d.ts +0 -99
  347. package/dist/types-DCRvasyH.d.mts +0 -99
  348. package/dist/types-IYCqCk2g.d.mts +0 -70
  349. /package/dist/{auth → common/auth}/client/index.js.map +0 -0
  350. /package/dist/{auth → common/auth}/client/index.mjs.map +0 -0
  351. /package/dist/{auth → common/auth}/hooks/index.js.map +0 -0
  352. /package/dist/{auth → common/auth}/hooks/index.mjs.map +0 -0
  353. /package/dist/{auth → common/auth/schema}/index.js.map +0 -0
  354. /package/dist/{auth → common/auth/schema}/index.mjs.map +0 -0
@@ -1,40 +0,0 @@
1
- import { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema/index.js';
2
- import { i as AuthService, U as User, a as UserSession, d as SessionValidation } from '../../../index-DNKZ7-R_.js';
3
- import 'drizzle-orm';
4
- import 'drizzle-orm/pg-core';
5
-
6
- interface LegacyAuthDbConfig {
7
- db: any;
8
- tables?: {
9
- users?: typeof legacyUsers;
10
- userSessions?: typeof legacyUserSessions;
11
- verificationCodes?: typeof legacyVerificationCodes;
12
- };
13
- saltRounds?: number;
14
- sessionDurationMs?: number;
15
- }
16
- /**
17
- * 认证数据库服务类(Legacy:手机号 + Cookie 会话)
18
- */
19
- declare class LegacyAuthDbService implements AuthService {
20
- private db;
21
- private tables;
22
- private saltRounds;
23
- private sessionDurationMs;
24
- constructor(config: LegacyAuthDbConfig);
25
- verifyPassword(phone: string, password: string): Promise<User | null>;
26
- createUser(phone: string, password: string, name?: string): Promise<User>;
27
- updateLastLogin(userId: number): Promise<void>;
28
- createSession(userId: number): Promise<UserSession>;
29
- validateSession(sessionToken: string): Promise<SessionValidation>;
30
- deleteSession(sessionToken: string): Promise<void>;
31
- deleteUserSessions(userId: number): Promise<void>;
32
- cleanupExpiredSessions(): Promise<void>;
33
- getUserByPhone(phone: string): Promise<User | null>;
34
- sendVerificationCode(phone: string): Promise<string>;
35
- verifyCode(phone: string, code: string): Promise<boolean>;
36
- resetPassword(phone: string, newPassword: string): Promise<void>;
37
- cleanupExpiredVerificationCodes(): Promise<void>;
38
- }
39
-
40
- export { type LegacyAuthDbConfig, LegacyAuthDbService };
@@ -1,258 +0,0 @@
1
- 'use strict';
2
-
3
- var crypto = require('crypto');
4
- var drizzleOrm = require('drizzle-orm');
5
- var bcrypt = require('bcryptjs');
6
- var pgCore = require('drizzle-orm/pg-core');
7
-
8
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
9
-
10
- var bcrypt__default = /*#__PURE__*/_interopDefault(bcrypt);
11
-
12
- // src/business/auth-legacy/services/authDbService.ts
13
- var legacyUsers = pgCore.pgTable("users", {
14
- id: pgCore.serial("id").primaryKey(),
15
- phone: pgCore.varchar("phone", { length: 20 }).notNull().unique(),
16
- password: pgCore.varchar("password", { length: 255 }).notNull(),
17
- name: pgCore.varchar("name", { length: 100 }),
18
- email: pgCore.varchar("email", { length: 255 }),
19
- isActive: pgCore.boolean("is_active").notNull().default(true),
20
- role: pgCore.varchar("role", { length: 20 }).notNull().default("user"),
21
- lastLoginAt: pgCore.timestamp("last_login_at"),
22
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
23
- updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
24
- });
25
- var legacyUserSessions = pgCore.pgTable("user_sessions", {
26
- id: pgCore.serial("id").primaryKey(),
27
- userId: pgCore.integer("user_id").notNull().references(() => legacyUsers.id, { onDelete: "cascade" }),
28
- sessionToken: pgCore.varchar("session_token", { length: 255 }).notNull().unique(),
29
- expiresAt: pgCore.timestamp("expires_at").notNull(),
30
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
31
- });
32
- var legacyVerificationCodes = pgCore.pgTable("verification_codes", {
33
- id: pgCore.serial("id").primaryKey(),
34
- phone: pgCore.text("phone").notNull(),
35
- code: pgCore.text("code").notNull(),
36
- expiresAt: pgCore.timestamp("expires_at").notNull(),
37
- createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
38
- used: pgCore.boolean("used").default(false).notNull()
39
- });
40
- drizzleOrm.relations(legacyUsers, ({ many }) => ({
41
- sessions: many(legacyUserSessions)
42
- }));
43
- drizzleOrm.relations(legacyUserSessions, ({ one }) => ({
44
- user: one(legacyUsers, {
45
- fields: [legacyUserSessions.userId],
46
- references: [legacyUsers.id]
47
- })
48
- }));
49
-
50
- // src/business/auth-legacy/services/authDbService.ts
51
- var LegacyAuthDbService = class {
52
- constructor(config) {
53
- this.db = config.db;
54
- this.tables = {
55
- users: config.tables?.users ?? legacyUsers,
56
- userSessions: config.tables?.userSessions ?? legacyUserSessions,
57
- verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes
58
- };
59
- this.saltRounds = config.saltRounds || 12;
60
- this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1e3;
61
- }
62
- async verifyPassword(phone, password) {
63
- try {
64
- const result = await this.db.select().from(this.tables.users).where(drizzleOrm.eq(this.tables.users.phone, phone)).limit(1);
65
- const user = result[0];
66
- if (!user) return null;
67
- if (!user.isActive) return null;
68
- const isValid = await bcrypt__default.default.compare(password, user.password);
69
- if (!isValid) return null;
70
- const { password: _, ...userWithoutPassword } = user;
71
- return userWithoutPassword;
72
- } catch (error) {
73
- console.error("\u{1F4A5} [LegacyAuthDbService] \u5BC6\u7801\u9A8C\u8BC1\u5F02\u5E38:", error);
74
- return null;
75
- }
76
- }
77
- async createUser(phone, password, name) {
78
- try {
79
- const existingUser = await this.db.select().from(this.tables.users).where(drizzleOrm.eq(this.tables.users.phone, phone)).limit(1);
80
- if (existingUser.length > 0) {
81
- throw new Error("\u7528\u6237\u5DF2\u5B58\u5728");
82
- }
83
- const hashedPassword = await bcrypt__default.default.hash(password, this.saltRounds);
84
- const result = await this.db.insert(this.tables.users).values({
85
- phone,
86
- password: hashedPassword,
87
- name: name || null,
88
- isActive: true,
89
- role: "user"
90
- }).returning();
91
- const createdUser = result[0];
92
- if (!createdUser) {
93
- throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25: \u672A\u8FD4\u56DE\u7528\u6237\u8BB0\u5F55");
94
- }
95
- const { password: _, ...userWithoutPassword } = createdUser;
96
- return userWithoutPassword;
97
- } catch (error) {
98
- console.error("\u521B\u5EFA\u7528\u6237\u5931\u8D25:", error);
99
- throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25");
100
- }
101
- }
102
- async updateLastLogin(userId) {
103
- try {
104
- await this.db.update(this.tables.users).set({ lastLoginAt: /* @__PURE__ */ new Date(), updatedAt: /* @__PURE__ */ new Date() }).where(drizzleOrm.eq(this.tables.users.id, userId));
105
- } catch (error) {
106
- console.error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25:", error);
107
- throw new Error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25");
108
- }
109
- }
110
- async createSession(userId) {
111
- try {
112
- const sessionToken = crypto.randomBytes(32).toString("hex");
113
- const expiresAt = new Date(Date.now() + this.sessionDurationMs);
114
- const result = await this.db.insert(this.tables.userSessions).values({
115
- userId,
116
- sessionToken,
117
- expiresAt
118
- }).returning();
119
- const session = result[0];
120
- if (!session) {
121
- throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25: \u672A\u8FD4\u56DE\u4F1A\u8BDD\u8BB0\u5F55");
122
- }
123
- return session;
124
- } catch (error) {
125
- console.error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25:", error);
126
- throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25");
127
- }
128
- }
129
- async validateSession(sessionToken) {
130
- try {
131
- const now = /* @__PURE__ */ new Date();
132
- const result = await this.db.select({
133
- session: this.tables.userSessions,
134
- user: this.tables.users
135
- }).from(this.tables.userSessions).innerJoin(this.tables.users, drizzleOrm.eq(this.tables.userSessions.userId, this.tables.users.id)).where(
136
- drizzleOrm.and(
137
- drizzleOrm.eq(this.tables.userSessions.sessionToken, sessionToken),
138
- drizzleOrm.gt(this.tables.userSessions.expiresAt, now),
139
- drizzleOrm.eq(this.tables.users.isActive, true)
140
- )
141
- ).limit(1);
142
- const row = result[0];
143
- if (!row) {
144
- return { valid: false };
145
- }
146
- const { password: _, ...userWithoutPassword } = row.user;
147
- return { valid: true, user: userWithoutPassword };
148
- } catch (error) {
149
- console.error("\u4F1A\u8BDD\u9A8C\u8BC1\u5931\u8D25:", error);
150
- return { valid: false };
151
- }
152
- }
153
- async deleteSession(sessionToken) {
154
- try {
155
- await this.db.delete(this.tables.userSessions).where(drizzleOrm.eq(this.tables.userSessions.sessionToken, sessionToken));
156
- } catch (error) {
157
- console.error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25:", error);
158
- throw new Error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25");
159
- }
160
- }
161
- async deleteUserSessions(userId) {
162
- try {
163
- await this.db.delete(this.tables.userSessions).where(drizzleOrm.eq(this.tables.userSessions.userId, userId));
164
- } catch (error) {
165
- console.error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25:", error);
166
- throw new Error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25");
167
- }
168
- }
169
- async cleanupExpiredSessions() {
170
- try {
171
- const now = /* @__PURE__ */ new Date();
172
- await this.db.delete(this.tables.userSessions).where(drizzleOrm.lt(this.tables.userSessions.expiresAt, now));
173
- } catch (error) {
174
- console.error("\u6E05\u7406\u8FC7\u671F\u4F1A\u8BDD\u5931\u8D25:", error);
175
- }
176
- }
177
- async getUserByPhone(phone) {
178
- try {
179
- const result = await this.db.select().from(this.tables.users).where(drizzleOrm.eq(this.tables.users.phone, phone)).limit(1);
180
- const user = result[0];
181
- if (!user) return null;
182
- const { password: _, ...userWithoutPassword } = user;
183
- return userWithoutPassword;
184
- } catch (error) {
185
- console.error("\u67E5\u8BE2\u7528\u6237\u5931\u8D25:", error);
186
- throw error;
187
- }
188
- }
189
- async sendVerificationCode(phone) {
190
- try {
191
- await this.cleanupExpiredVerificationCodes();
192
- const existingCode = await this.db.select().from(this.tables.verificationCodes).where(
193
- drizzleOrm.and(
194
- drizzleOrm.eq(this.tables.verificationCodes.phone, phone),
195
- drizzleOrm.eq(this.tables.verificationCodes.used, false),
196
- drizzleOrm.gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
197
- )
198
- ).limit(1);
199
- const currentCode = existingCode[0];
200
- if (currentCode) {
201
- const timeDiff = Date.now() - currentCode.createdAt.getTime();
202
- if (timeDiff < 60 * 1e3) {
203
- throw new Error("\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");
204
- }
205
- }
206
- const code = Math.floor(1e5 + Math.random() * 9e5).toString();
207
- await this.db.insert(this.tables.verificationCodes).values({
208
- phone,
209
- code,
210
- expiresAt: new Date(Date.now() + 10 * 60 * 1e3)
211
- }).returning();
212
- return code;
213
- } catch (error) {
214
- console.error("\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
215
- throw error;
216
- }
217
- }
218
- async verifyCode(phone, code) {
219
- try {
220
- const result = await this.db.select().from(this.tables.verificationCodes).where(
221
- drizzleOrm.and(
222
- drizzleOrm.eq(this.tables.verificationCodes.phone, phone),
223
- drizzleOrm.eq(this.tables.verificationCodes.code, code),
224
- drizzleOrm.eq(this.tables.verificationCodes.used, false),
225
- drizzleOrm.gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
226
- )
227
- ).limit(1);
228
- const verificationCode = result[0];
229
- if (!verificationCode) return false;
230
- await this.db.update(this.tables.verificationCodes).set({ used: true }).where(drizzleOrm.eq(this.tables.verificationCodes.id, verificationCode.id));
231
- return true;
232
- } catch (error) {
233
- console.error("\u9A8C\u8BC1\u7801\u9A8C\u8BC1\u5931\u8D25:", error);
234
- throw error;
235
- }
236
- }
237
- async resetPassword(phone, newPassword) {
238
- try {
239
- const hashedPassword = await bcrypt__default.default.hash(newPassword, this.saltRounds);
240
- await this.db.update(this.tables.users).set({ password: hashedPassword }).where(drizzleOrm.eq(this.tables.users.phone, phone));
241
- } catch (error) {
242
- console.error("\u5BC6\u7801\u91CD\u7F6E\u5931\u8D25:", error);
243
- throw error;
244
- }
245
- }
246
- async cleanupExpiredVerificationCodes() {
247
- try {
248
- const now = /* @__PURE__ */ new Date();
249
- await this.db.delete(this.tables.verificationCodes).where(drizzleOrm.lt(this.tables.verificationCodes.expiresAt, now)).returning();
250
- } catch (error) {
251
- console.error("\u6E05\u7406\u8FC7\u671F\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
252
- }
253
- }
254
- };
255
-
256
- exports.LegacyAuthDbService = LegacyAuthDbService;
257
- //# sourceMappingURL=index.js.map
258
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/business/auth-legacy/schema/index.ts","../../../../src/business/auth-legacy/services/authDbService.ts"],"names":["pgTable","serial","varchar","boolean","timestamp","integer","text","relations","eq","bcrypt","randomBytes","and","gt","lt"],"mappings":"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","file":"index.js","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n"]}
@@ -1,252 +0,0 @@
1
- import { randomBytes } from 'crypto';
2
- import { relations, eq, and, gt, lt } from 'drizzle-orm';
3
- import bcrypt from 'bcryptjs';
4
- import { pgTable, timestamp, varchar, boolean, serial, integer, text } from 'drizzle-orm/pg-core';
5
-
6
- // src/business/auth-legacy/services/authDbService.ts
7
- var legacyUsers = pgTable("users", {
8
- id: serial("id").primaryKey(),
9
- phone: varchar("phone", { length: 20 }).notNull().unique(),
10
- password: varchar("password", { length: 255 }).notNull(),
11
- name: varchar("name", { length: 100 }),
12
- email: varchar("email", { length: 255 }),
13
- isActive: boolean("is_active").notNull().default(true),
14
- role: varchar("role", { length: 20 }).notNull().default("user"),
15
- lastLoginAt: timestamp("last_login_at"),
16
- createdAt: timestamp("created_at").defaultNow().notNull(),
17
- updatedAt: timestamp("updated_at").defaultNow().notNull()
18
- });
19
- var legacyUserSessions = pgTable("user_sessions", {
20
- id: serial("id").primaryKey(),
21
- userId: integer("user_id").notNull().references(() => legacyUsers.id, { onDelete: "cascade" }),
22
- sessionToken: varchar("session_token", { length: 255 }).notNull().unique(),
23
- expiresAt: timestamp("expires_at").notNull(),
24
- createdAt: timestamp("created_at").defaultNow().notNull()
25
- });
26
- var legacyVerificationCodes = pgTable("verification_codes", {
27
- id: serial("id").primaryKey(),
28
- phone: text("phone").notNull(),
29
- code: text("code").notNull(),
30
- expiresAt: timestamp("expires_at").notNull(),
31
- createdAt: timestamp("created_at").defaultNow().notNull(),
32
- used: boolean("used").default(false).notNull()
33
- });
34
- relations(legacyUsers, ({ many }) => ({
35
- sessions: many(legacyUserSessions)
36
- }));
37
- relations(legacyUserSessions, ({ one }) => ({
38
- user: one(legacyUsers, {
39
- fields: [legacyUserSessions.userId],
40
- references: [legacyUsers.id]
41
- })
42
- }));
43
-
44
- // src/business/auth-legacy/services/authDbService.ts
45
- var LegacyAuthDbService = class {
46
- constructor(config) {
47
- this.db = config.db;
48
- this.tables = {
49
- users: config.tables?.users ?? legacyUsers,
50
- userSessions: config.tables?.userSessions ?? legacyUserSessions,
51
- verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes
52
- };
53
- this.saltRounds = config.saltRounds || 12;
54
- this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1e3;
55
- }
56
- async verifyPassword(phone, password) {
57
- try {
58
- const result = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
59
- const user = result[0];
60
- if (!user) return null;
61
- if (!user.isActive) return null;
62
- const isValid = await bcrypt.compare(password, user.password);
63
- if (!isValid) return null;
64
- const { password: _, ...userWithoutPassword } = user;
65
- return userWithoutPassword;
66
- } catch (error) {
67
- console.error("\u{1F4A5} [LegacyAuthDbService] \u5BC6\u7801\u9A8C\u8BC1\u5F02\u5E38:", error);
68
- return null;
69
- }
70
- }
71
- async createUser(phone, password, name) {
72
- try {
73
- const existingUser = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
74
- if (existingUser.length > 0) {
75
- throw new Error("\u7528\u6237\u5DF2\u5B58\u5728");
76
- }
77
- const hashedPassword = await bcrypt.hash(password, this.saltRounds);
78
- const result = await this.db.insert(this.tables.users).values({
79
- phone,
80
- password: hashedPassword,
81
- name: name || null,
82
- isActive: true,
83
- role: "user"
84
- }).returning();
85
- const createdUser = result[0];
86
- if (!createdUser) {
87
- throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25: \u672A\u8FD4\u56DE\u7528\u6237\u8BB0\u5F55");
88
- }
89
- const { password: _, ...userWithoutPassword } = createdUser;
90
- return userWithoutPassword;
91
- } catch (error) {
92
- console.error("\u521B\u5EFA\u7528\u6237\u5931\u8D25:", error);
93
- throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25");
94
- }
95
- }
96
- async updateLastLogin(userId) {
97
- try {
98
- await this.db.update(this.tables.users).set({ lastLoginAt: /* @__PURE__ */ new Date(), updatedAt: /* @__PURE__ */ new Date() }).where(eq(this.tables.users.id, userId));
99
- } catch (error) {
100
- console.error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25:", error);
101
- throw new Error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25");
102
- }
103
- }
104
- async createSession(userId) {
105
- try {
106
- const sessionToken = randomBytes(32).toString("hex");
107
- const expiresAt = new Date(Date.now() + this.sessionDurationMs);
108
- const result = await this.db.insert(this.tables.userSessions).values({
109
- userId,
110
- sessionToken,
111
- expiresAt
112
- }).returning();
113
- const session = result[0];
114
- if (!session) {
115
- throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25: \u672A\u8FD4\u56DE\u4F1A\u8BDD\u8BB0\u5F55");
116
- }
117
- return session;
118
- } catch (error) {
119
- console.error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25:", error);
120
- throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25");
121
- }
122
- }
123
- async validateSession(sessionToken) {
124
- try {
125
- const now = /* @__PURE__ */ new Date();
126
- const result = await this.db.select({
127
- session: this.tables.userSessions,
128
- user: this.tables.users
129
- }).from(this.tables.userSessions).innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id)).where(
130
- and(
131
- eq(this.tables.userSessions.sessionToken, sessionToken),
132
- gt(this.tables.userSessions.expiresAt, now),
133
- eq(this.tables.users.isActive, true)
134
- )
135
- ).limit(1);
136
- const row = result[0];
137
- if (!row) {
138
- return { valid: false };
139
- }
140
- const { password: _, ...userWithoutPassword } = row.user;
141
- return { valid: true, user: userWithoutPassword };
142
- } catch (error) {
143
- console.error("\u4F1A\u8BDD\u9A8C\u8BC1\u5931\u8D25:", error);
144
- return { valid: false };
145
- }
146
- }
147
- async deleteSession(sessionToken) {
148
- try {
149
- await this.db.delete(this.tables.userSessions).where(eq(this.tables.userSessions.sessionToken, sessionToken));
150
- } catch (error) {
151
- console.error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25:", error);
152
- throw new Error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25");
153
- }
154
- }
155
- async deleteUserSessions(userId) {
156
- try {
157
- await this.db.delete(this.tables.userSessions).where(eq(this.tables.userSessions.userId, userId));
158
- } catch (error) {
159
- console.error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25:", error);
160
- throw new Error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25");
161
- }
162
- }
163
- async cleanupExpiredSessions() {
164
- try {
165
- const now = /* @__PURE__ */ new Date();
166
- await this.db.delete(this.tables.userSessions).where(lt(this.tables.userSessions.expiresAt, now));
167
- } catch (error) {
168
- console.error("\u6E05\u7406\u8FC7\u671F\u4F1A\u8BDD\u5931\u8D25:", error);
169
- }
170
- }
171
- async getUserByPhone(phone) {
172
- try {
173
- const result = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
174
- const user = result[0];
175
- if (!user) return null;
176
- const { password: _, ...userWithoutPassword } = user;
177
- return userWithoutPassword;
178
- } catch (error) {
179
- console.error("\u67E5\u8BE2\u7528\u6237\u5931\u8D25:", error);
180
- throw error;
181
- }
182
- }
183
- async sendVerificationCode(phone) {
184
- try {
185
- await this.cleanupExpiredVerificationCodes();
186
- const existingCode = await this.db.select().from(this.tables.verificationCodes).where(
187
- and(
188
- eq(this.tables.verificationCodes.phone, phone),
189
- eq(this.tables.verificationCodes.used, false),
190
- gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
191
- )
192
- ).limit(1);
193
- const currentCode = existingCode[0];
194
- if (currentCode) {
195
- const timeDiff = Date.now() - currentCode.createdAt.getTime();
196
- if (timeDiff < 60 * 1e3) {
197
- throw new Error("\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");
198
- }
199
- }
200
- const code = Math.floor(1e5 + Math.random() * 9e5).toString();
201
- await this.db.insert(this.tables.verificationCodes).values({
202
- phone,
203
- code,
204
- expiresAt: new Date(Date.now() + 10 * 60 * 1e3)
205
- }).returning();
206
- return code;
207
- } catch (error) {
208
- console.error("\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
209
- throw error;
210
- }
211
- }
212
- async verifyCode(phone, code) {
213
- try {
214
- const result = await this.db.select().from(this.tables.verificationCodes).where(
215
- and(
216
- eq(this.tables.verificationCodes.phone, phone),
217
- eq(this.tables.verificationCodes.code, code),
218
- eq(this.tables.verificationCodes.used, false),
219
- gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
220
- )
221
- ).limit(1);
222
- const verificationCode = result[0];
223
- if (!verificationCode) return false;
224
- await this.db.update(this.tables.verificationCodes).set({ used: true }).where(eq(this.tables.verificationCodes.id, verificationCode.id));
225
- return true;
226
- } catch (error) {
227
- console.error("\u9A8C\u8BC1\u7801\u9A8C\u8BC1\u5931\u8D25:", error);
228
- throw error;
229
- }
230
- }
231
- async resetPassword(phone, newPassword) {
232
- try {
233
- const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);
234
- await this.db.update(this.tables.users).set({ password: hashedPassword }).where(eq(this.tables.users.phone, phone));
235
- } catch (error) {
236
- console.error("\u5BC6\u7801\u91CD\u7F6E\u5931\u8D25:", error);
237
- throw error;
238
- }
239
- }
240
- async cleanupExpiredVerificationCodes() {
241
- try {
242
- const now = /* @__PURE__ */ new Date();
243
- await this.db.delete(this.tables.verificationCodes).where(lt(this.tables.verificationCodes.expiresAt, now)).returning();
244
- } catch (error) {
245
- console.error("\u6E05\u7406\u8FC7\u671F\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
246
- }
247
- }
248
- };
249
-
250
- export { LegacyAuthDbService };
251
- //# sourceMappingURL=index.mjs.map
252
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/business/auth-legacy/schema/index.ts","../../../../src/business/auth-legacy/services/authDbService.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\n\n// 用户表\nexport const legacyUsers = pgTable('users', {\n id: serial('id').primaryKey(),\n phone: varchar('phone', { length: 20 }).notNull().unique(),\n password: varchar('password', { length: 255 }).notNull(),\n name: varchar('name', { length: 100 }),\n email: varchar('email', { length: 255 }),\n isActive: boolean('is_active').notNull().default(true),\n role: varchar('role', { length: 20 }).notNull().default('user'),\n lastLoginAt: timestamp('last_login_at'),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n// 用户会话表\nexport const legacyUserSessions = pgTable('user_sessions', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => legacyUsers.id, { onDelete: 'cascade' }),\n sessionToken: varchar('session_token', { length: 255 }).notNull().unique(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// 验证码表\nexport const legacyVerificationCodes = pgTable('verification_codes', {\n id: serial('id').primaryKey(),\n phone: text('phone').notNull(),\n code: text('code').notNull(),\n expiresAt: timestamp('expires_at').notNull(),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n used: boolean('used').default(false).notNull(),\n});\n\n// 关系定义\nexport const legacyUsersRelations = relations(legacyUsers, ({ many }) => ({\n sessions: many(legacyUserSessions),\n}));\n\nexport const legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({\n user: one(legacyUsers, {\n fields: [legacyUserSessions.userId],\n references: [legacyUsers.id],\n }),\n}));\n","import { randomBytes } from 'crypto';\nimport { eq, and, gt, lt } from 'drizzle-orm';\nimport bcrypt from 'bcryptjs';\nimport type { AuthService, SessionValidation, User, UserSession } from '../types';\nimport { legacyUsers, legacyUserSessions, legacyVerificationCodes } from '../schema';\n\nexport interface LegacyAuthDbConfig {\n db: any;\n tables?: {\n users?: typeof legacyUsers;\n userSessions?: typeof legacyUserSessions;\n verificationCodes?: typeof legacyVerificationCodes;\n };\n saltRounds?: number;\n sessionDurationMs?: number;\n}\n\ntype LegacyAuthTables = {\n users: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['users']>;\n userSessions: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['userSessions']>;\n verificationCodes: NonNullable<NonNullable<LegacyAuthDbConfig['tables']>['verificationCodes']>;\n};\n\n/**\n * 认证数据库服务类(Legacy:手机号 + Cookie 会话)\n */\nexport class LegacyAuthDbService implements AuthService {\n private db: LegacyAuthDbConfig['db'];\n private tables: LegacyAuthTables;\n private saltRounds: number;\n private sessionDurationMs: number;\n\n constructor(config: LegacyAuthDbConfig) {\n this.db = config.db;\n this.tables = {\n users: config.tables?.users ?? legacyUsers,\n userSessions: config.tables?.userSessions ?? legacyUserSessions,\n verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes,\n };\n this.saltRounds = config.saltRounds || 12;\n this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1000;\n }\n\n async verifyPassword(phone: string, password: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n if (!user.isActive) return null;\n\n const isValid = await bcrypt.compare(password, user.password);\n if (!isValid) return null;\n\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('💥 [LegacyAuthDbService] 密码验证异常:', error);\n return null;\n }\n }\n\n async createUser(phone: string, password: string, name?: string): Promise<User> {\n try {\n const existingUser = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n if (existingUser.length > 0) {\n throw new Error('用户已存在');\n }\n\n const hashedPassword = await bcrypt.hash(password, this.saltRounds);\n const result = await this.db\n .insert(this.tables.users)\n .values({\n phone,\n password: hashedPassword,\n name: name || null,\n isActive: true,\n role: 'user',\n })\n .returning();\n\n const createdUser = result[0];\n if (!createdUser) {\n throw new Error('创建用户失败: 未返回用户记录');\n }\n const { password: _, ...userWithoutPassword } = createdUser;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('创建用户失败:', error);\n throw new Error('创建用户失败');\n }\n }\n\n async updateLastLogin(userId: number): Promise<void> {\n try {\n await this.db\n .update(this.tables.users)\n .set({ lastLoginAt: new Date(), updatedAt: new Date() })\n .where(eq(this.tables.users.id, userId));\n } catch (error) {\n console.error('更新最后登录时间失败:', error);\n throw new Error('更新最后登录时间失败');\n }\n }\n\n async createSession(userId: number): Promise<UserSession> {\n try {\n const sessionToken = randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + this.sessionDurationMs);\n\n const result = await this.db\n .insert(this.tables.userSessions)\n .values({\n userId,\n sessionToken,\n expiresAt,\n })\n .returning();\n\n const session = result[0];\n if (!session) {\n throw new Error('创建会话失败: 未返回会话记录');\n }\n return session;\n } catch (error) {\n console.error('创建会话失败:', error);\n throw new Error('创建会话失败');\n }\n }\n\n async validateSession(sessionToken: string): Promise<SessionValidation> {\n try {\n const now = new Date();\n const result = await this.db\n .select({\n session: this.tables.userSessions,\n user: this.tables.users,\n })\n .from(this.tables.userSessions)\n .innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id))\n .where(\n and(\n eq(this.tables.userSessions.sessionToken, sessionToken),\n gt(this.tables.userSessions.expiresAt, now),\n eq(this.tables.users.isActive, true)\n )\n )\n .limit(1);\n\n const row = result[0];\n if (!row) {\n return { valid: false };\n }\n\n const { password: _, ...userWithoutPassword } = row.user;\n return { valid: true, user: userWithoutPassword as User };\n } catch (error) {\n console.error('会话验证失败:', error);\n return { valid: false };\n }\n }\n\n async deleteSession(sessionToken: string): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.sessionToken, sessionToken));\n } catch (error) {\n console.error('删除会话失败:', error);\n throw new Error('删除会话失败');\n }\n }\n\n async deleteUserSessions(userId: number): Promise<void> {\n try {\n await this.db\n .delete(this.tables.userSessions)\n .where(eq(this.tables.userSessions.userId, userId));\n } catch (error) {\n console.error('删除用户会话失败:', error);\n throw new Error('删除用户会话失败');\n }\n }\n\n async cleanupExpiredSessions(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.userSessions)\n .where(lt(this.tables.userSessions.expiresAt, now));\n } catch (error) {\n console.error('清理过期会话失败:', error);\n }\n }\n\n async getUserByPhone(phone: string): Promise<User | null> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.users)\n .where(eq(this.tables.users.phone, phone))\n .limit(1);\n\n const user = result[0];\n if (!user) return null;\n const { password: _, ...userWithoutPassword } = user;\n return userWithoutPassword as User;\n } catch (error) {\n console.error('查询用户失败:', error);\n throw error;\n }\n }\n\n async sendVerificationCode(phone: string): Promise<string> {\n try {\n await this.cleanupExpiredVerificationCodes();\n\n const existingCode = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const currentCode = existingCode[0];\n if (currentCode) {\n const timeDiff = Date.now() - currentCode.createdAt.getTime();\n if (timeDiff < 60 * 1000) {\n throw new Error('验证码发送过于频繁,请稍后再试');\n }\n }\n\n const code = Math.floor(100000 + Math.random() * 900000).toString();\n\n await this.db\n .insert(this.tables.verificationCodes)\n .values({\n phone,\n code,\n expiresAt: new Date(Date.now() + 10 * 60 * 1000),\n })\n .returning();\n\n return code;\n } catch (error) {\n console.error('发送验证码失败:', error);\n throw error;\n }\n }\n\n async verifyCode(phone: string, code: string): Promise<boolean> {\n try {\n const result = await this.db\n .select()\n .from(this.tables.verificationCodes)\n .where(\n and(\n eq(this.tables.verificationCodes.phone, phone),\n eq(this.tables.verificationCodes.code, code),\n eq(this.tables.verificationCodes.used, false),\n gt(this.tables.verificationCodes.expiresAt, new Date())\n )\n )\n .limit(1);\n\n const verificationCode = result[0];\n if (!verificationCode) return false;\n\n await this.db\n .update(this.tables.verificationCodes)\n .set({ used: true })\n .where(eq(this.tables.verificationCodes.id, verificationCode.id));\n\n return true;\n } catch (error) {\n console.error('验证码验证失败:', error);\n throw error;\n }\n }\n\n async resetPassword(phone: string, newPassword: string): Promise<void> {\n try {\n const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);\n await this.db\n .update(this.tables.users)\n .set({ password: hashedPassword })\n .where(eq(this.tables.users.phone, phone));\n } catch (error) {\n console.error('密码重置失败:', error);\n throw error;\n }\n }\n\n async cleanupExpiredVerificationCodes(): Promise<void> {\n try {\n const now = new Date();\n await this.db\n .delete(this.tables.verificationCodes)\n .where(lt(this.tables.verificationCodes.expiresAt, now))\n .returning();\n } catch (error) {\n console.error('清理过期验证码失败:', error);\n }\n }\n}\n"]}