sa2kit 2.0.1 → 2.0.3

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 (278) hide show
  1. package/README.md +1 -1
  2. package/dist/CollisionBalls-BpHufX3H.d.mts +41 -0
  3. package/dist/CollisionBalls-BpHufX3H.d.ts +41 -0
  4. package/dist/ConfigService-BxK06xP6.d.mts +262 -0
  5. package/dist/ConfigService-BxK06xP6.d.ts +262 -0
  6. package/dist/UniversalFileService-BpvbZitV.d.mts +139 -0
  7. package/dist/UniversalFileService-GsP6D3Rc.d.ts +139 -0
  8. package/dist/audioDetection/index.d.mts +449 -0
  9. package/dist/audioDetection/index.d.ts +449 -0
  10. package/dist/audioDetection/index.js +1244 -0
  11. package/dist/audioDetection/index.js.map +1 -0
  12. package/dist/audioDetection/index.mjs +1227 -0
  13. package/dist/audioDetection/index.mjs.map +1 -0
  14. package/dist/auth/legacy/core/index.d.mts +42 -0
  15. package/dist/auth/legacy/core/index.d.ts +42 -0
  16. package/dist/auth/legacy/core/index.js +242 -0
  17. package/dist/auth/legacy/core/index.js.map +1 -0
  18. package/dist/auth/legacy/core/index.mjs +226 -0
  19. package/dist/auth/legacy/core/index.mjs.map +1 -0
  20. package/dist/auth/legacy/db/index.d.mts +5 -0
  21. package/dist/auth/legacy/db/index.d.ts +5 -0
  22. package/dist/auth/legacy/db/index.js +261 -0
  23. package/dist/auth/legacy/db/index.js.map +1 -0
  24. package/dist/auth/legacy/db/index.mjs +250 -0
  25. package/dist/auth/legacy/db/index.mjs.map +1 -0
  26. package/dist/auth/legacy/index.d.mts +5 -0
  27. package/dist/auth/legacy/index.d.ts +5 -0
  28. package/dist/auth/legacy/index.js +1107 -0
  29. package/dist/auth/legacy/index.js.map +1 -0
  30. package/dist/auth/legacy/index.mjs +1086 -0
  31. package/dist/auth/legacy/index.mjs.map +1 -0
  32. package/dist/auth/legacy/logic/index.d.mts +9 -0
  33. package/dist/auth/legacy/logic/index.d.ts +9 -0
  34. package/dist/auth/legacy/logic/index.js +194 -0
  35. package/dist/auth/legacy/logic/index.js.map +1 -0
  36. package/dist/auth/legacy/logic/index.mjs +187 -0
  37. package/dist/auth/legacy/logic/index.mjs.map +1 -0
  38. package/dist/auth/legacy/miniapp/index.d.mts +5 -0
  39. package/dist/auth/legacy/miniapp/index.d.ts +5 -0
  40. package/dist/auth/legacy/miniapp/index.js +506 -0
  41. package/dist/auth/legacy/miniapp/index.js.map +1 -0
  42. package/dist/auth/legacy/miniapp/index.mjs +487 -0
  43. package/dist/auth/legacy/miniapp/index.mjs.map +1 -0
  44. package/dist/auth/legacy/routes/index.d.mts +53 -0
  45. package/dist/auth/legacy/routes/index.d.ts +53 -0
  46. package/dist/auth/legacy/routes/index.js +278 -0
  47. package/dist/auth/legacy/routes/index.js.map +1 -0
  48. package/dist/auth/legacy/routes/index.mjs +271 -0
  49. package/dist/auth/legacy/routes/index.mjs.map +1 -0
  50. package/dist/auth/legacy/schema/index.d.mts +401 -0
  51. package/dist/auth/legacy/schema/index.d.ts +401 -0
  52. package/dist/auth/legacy/schema/index.js +50 -0
  53. package/dist/auth/legacy/schema/index.js.map +1 -0
  54. package/dist/auth/legacy/schema/index.mjs +44 -0
  55. package/dist/auth/legacy/schema/index.mjs.map +1 -0
  56. package/dist/auth/legacy/server/index.d.mts +13 -0
  57. package/dist/auth/legacy/server/index.d.ts +13 -0
  58. package/dist/auth/legacy/server/index.js +21 -0
  59. package/dist/auth/legacy/server/index.js.map +1 -0
  60. package/dist/auth/legacy/server/index.mjs +19 -0
  61. package/dist/auth/legacy/server/index.mjs.map +1 -0
  62. package/dist/auth/legacy/services/index.d.mts +40 -0
  63. package/dist/auth/legacy/services/index.d.ts +40 -0
  64. package/dist/auth/legacy/services/index.js +258 -0
  65. package/dist/auth/legacy/services/index.js.map +1 -0
  66. package/dist/auth/legacy/services/index.mjs +252 -0
  67. package/dist/auth/legacy/services/index.mjs.map +1 -0
  68. package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
  69. package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
  70. package/dist/auth/legacy/ui/miniapp/index.js +298 -0
  71. package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
  72. package/dist/auth/legacy/ui/miniapp/index.mjs +290 -0
  73. package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
  74. package/dist/auth/legacy/ui/web/index.d.mts +22 -0
  75. package/dist/auth/legacy/ui/web/index.d.ts +22 -0
  76. package/dist/auth/legacy/ui/web/index.js +899 -0
  77. package/dist/auth/legacy/ui/web/index.js.map +1 -0
  78. package/dist/auth/legacy/ui/web/index.mjs +889 -0
  79. package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
  80. package/dist/auth/legacy/web/index.d.mts +5 -0
  81. package/dist/auth/legacy/web/index.d.ts +5 -0
  82. package/dist/auth/legacy/web/index.js +1107 -0
  83. package/dist/auth/legacy/web/index.js.map +1 -0
  84. package/dist/auth/legacy/web/index.mjs +1086 -0
  85. package/dist/auth/legacy/web/index.mjs.map +1 -0
  86. package/dist/auth/rn/index.d.mts +64 -0
  87. package/dist/auth/rn/index.d.ts +64 -0
  88. package/dist/auth/rn/index.js +765 -0
  89. package/dist/auth/rn/index.js.map +1 -0
  90. package/dist/auth/rn/index.mjs +754 -0
  91. package/dist/auth/rn/index.mjs.map +1 -0
  92. package/dist/base-api-client-ACKKt13v.d.mts +277 -0
  93. package/dist/base-api-client-ACKKt13v.d.ts +277 -0
  94. package/dist/boothVaultService-Cn4WPhjg.d.mts +83 -0
  95. package/dist/boothVaultService-Cn4WPhjg.d.ts +83 -0
  96. package/dist/business/index.d.mts +6 -0
  97. package/dist/business/index.d.ts +6 -0
  98. package/dist/business/index.js +1682 -0
  99. package/dist/business/index.js.map +1 -0
  100. package/dist/business/index.mjs +1675 -0
  101. package/dist/business/index.mjs.map +1 -0
  102. package/dist/calendar/index.d.mts +1325 -0
  103. package/dist/calendar/index.d.ts +1325 -0
  104. package/dist/calendar/index.js +5964 -0
  105. package/dist/calendar/index.js.map +1 -0
  106. package/dist/calendar/index.mjs +5878 -0
  107. package/dist/calendar/index.mjs.map +1 -0
  108. package/dist/calendar/routes/index.d.mts +118 -0
  109. package/dist/calendar/routes/index.d.ts +118 -0
  110. package/dist/calendar/routes/index.js +755 -0
  111. package/dist/calendar/routes/index.js.map +1 -0
  112. package/dist/calendar/routes/index.mjs +747 -0
  113. package/dist/calendar/routes/index.mjs.map +1 -0
  114. package/dist/components/index.d.mts +405 -0
  115. package/dist/components/index.d.ts +405 -0
  116. package/dist/components/index.js +2516 -0
  117. package/dist/components/index.js.map +1 -0
  118. package/dist/components/index.mjs +2396 -0
  119. package/dist/components/index.mjs.map +1 -0
  120. package/dist/drizzle-schema-BNhqj2AZ.d.mts +1114 -0
  121. package/dist/drizzle-schema-BNhqj2AZ.d.ts +1114 -0
  122. package/dist/festivalCard/index.d.mts +76 -0
  123. package/dist/festivalCard/index.d.ts +76 -0
  124. package/dist/festivalCard/index.js +1492 -0
  125. package/dist/festivalCard/index.js.map +1 -0
  126. package/dist/festivalCard/index.mjs +1475 -0
  127. package/dist/festivalCard/index.mjs.map +1 -0
  128. package/dist/festivalCard/routes/index.d.mts +42 -0
  129. package/dist/festivalCard/routes/index.d.ts +42 -0
  130. package/dist/festivalCard/routes/index.js +361 -0
  131. package/dist/festivalCard/routes/index.js.map +1 -0
  132. package/dist/festivalCard/routes/index.mjs +356 -0
  133. package/dist/festivalCard/routes/index.mjs.map +1 -0
  134. package/dist/festivalCard/server/index.d.mts +120 -0
  135. package/dist/festivalCard/server/index.d.ts +120 -0
  136. package/dist/festivalCard/server/index.js +272 -0
  137. package/dist/festivalCard/server/index.js.map +1 -0
  138. package/dist/festivalCard/server/index.mjs +265 -0
  139. package/dist/festivalCard/server/index.mjs.map +1 -0
  140. package/dist/festivalCardService-BFCRhJrq.d.ts +13 -0
  141. package/dist/festivalCardService-GriR2VMc.d.mts +13 -0
  142. package/dist/index-1Ag7IBXN.d.ts +144 -0
  143. package/dist/index-DNKZ7-R_.d.mts +184 -0
  144. package/dist/index-DNKZ7-R_.d.ts +184 -0
  145. package/dist/index-DSel44Ke.d.mts +93 -0
  146. package/dist/index-DSel44Ke.d.ts +93 -0
  147. package/dist/index-DdeZSeTJ.d.mts +144 -0
  148. package/dist/index-DrPcMJPc.d.mts +250 -0
  149. package/dist/index-DrPcMJPc.d.ts +250 -0
  150. package/dist/index.d.mts +5334 -0
  151. package/dist/index.d.ts +5334 -0
  152. package/dist/index.js +18809 -0
  153. package/dist/index.js.map +1 -0
  154. package/dist/index.mjs +18533 -0
  155. package/dist/index.mjs.map +1 -0
  156. package/dist/mikuContest/ui/web/index.d.mts +2 -0
  157. package/dist/mikuContest/ui/web/index.d.ts +2 -0
  158. package/dist/mikuContest/ui/web/index.js +353 -0
  159. package/dist/mikuContest/ui/web/index.js.map +1 -0
  160. package/dist/mikuContest/ui/web/index.mjs +343 -0
  161. package/dist/mikuContest/ui/web/index.mjs.map +1 -0
  162. package/dist/mikuFireworks3D/index.d.mts +268 -0
  163. package/dist/mikuFireworks3D/index.d.ts +268 -0
  164. package/dist/mikuFireworks3D/index.js +1267 -0
  165. package/dist/mikuFireworks3D/index.js.map +1 -0
  166. package/dist/mikuFireworks3D/index.mjs +1228 -0
  167. package/dist/mikuFireworks3D/index.mjs.map +1 -0
  168. package/dist/mikuFusionGame/index.d.mts +117 -0
  169. package/dist/mikuFusionGame/index.d.ts +117 -0
  170. package/dist/mikuFusionGame/index.js +1208 -0
  171. package/dist/mikuFusionGame/index.js.map +1 -0
  172. package/dist/mikuFusionGame/index.mjs +1195 -0
  173. package/dist/mikuFusionGame/index.mjs.map +1 -0
  174. package/dist/mmd/admin/index.d.mts +487 -0
  175. package/dist/mmd/admin/index.d.ts +487 -0
  176. package/dist/mmd/admin/index.js +1058 -0
  177. package/dist/mmd/admin/index.js.map +1 -0
  178. package/dist/mmd/admin/index.mjs +1027 -0
  179. package/dist/mmd/admin/index.mjs.map +1 -0
  180. package/dist/mmd/index.d.mts +2467 -0
  181. package/dist/mmd/index.d.ts +2467 -0
  182. package/dist/mmd/index.js +10119 -0
  183. package/dist/mmd/index.js.map +1 -0
  184. package/dist/mmd/index.mjs +10028 -0
  185. package/dist/mmd/index.mjs.map +1 -0
  186. package/dist/mmd/server/index.d.mts +139 -0
  187. package/dist/mmd/server/index.d.ts +139 -0
  188. package/dist/mmd/server/index.js +424 -0
  189. package/dist/mmd/server/index.js.map +1 -0
  190. package/dist/mmd/server/index.mjs +404 -0
  191. package/dist/mmd/server/index.mjs.map +1 -0
  192. package/dist/music/index.d.mts +74 -0
  193. package/dist/music/index.d.ts +74 -0
  194. package/dist/music/index.js +830 -0
  195. package/dist/music/index.js.map +1 -0
  196. package/dist/music/index.mjs +809 -0
  197. package/dist/music/index.mjs.map +1 -0
  198. package/dist/music/server/index.d.mts +1 -0
  199. package/dist/music/server/index.d.ts +1 -0
  200. package/dist/music/server/index.js +194 -0
  201. package/dist/music/server/index.js.map +1 -0
  202. package/dist/music/server/index.mjs +182 -0
  203. package/dist/music/server/index.mjs.map +1 -0
  204. package/dist/navigation/index.d.mts +93 -0
  205. package/dist/navigation/index.d.ts +93 -0
  206. package/dist/navigation/index.js +453 -0
  207. package/dist/navigation/index.js.map +1 -0
  208. package/dist/navigation/index.mjs +443 -0
  209. package/dist/navigation/index.mjs.map +1 -0
  210. package/dist/portfolio/index.d.mts +66 -0
  211. package/dist/portfolio/index.d.ts +66 -0
  212. package/dist/portfolio/index.js +736 -0
  213. package/dist/portfolio/index.js.map +1 -0
  214. package/dist/portfolio/index.mjs +724 -0
  215. package/dist/portfolio/index.mjs.map +1 -0
  216. package/dist/qqbot/server/index.d.mts +216 -0
  217. package/dist/qqbot/server/index.d.ts +216 -0
  218. package/dist/qqbot/server/index.js +394 -0
  219. package/dist/qqbot/server/index.js.map +1 -0
  220. package/dist/qqbot/server/index.mjs +385 -0
  221. package/dist/qqbot/server/index.mjs.map +1 -0
  222. package/dist/qqbot/ui/web/index.d.mts +10 -0
  223. package/dist/qqbot/ui/web/index.d.ts +10 -0
  224. package/dist/qqbot/ui/web/index.js +105 -0
  225. package/dist/qqbot/ui/web/index.js.map +1 -0
  226. package/dist/qqbot/ui/web/index.mjs +99 -0
  227. package/dist/qqbot/ui/web/index.mjs.map +1 -0
  228. package/dist/screenReceiver/index.d.mts +86 -0
  229. package/dist/screenReceiver/index.d.ts +86 -0
  230. package/dist/screenReceiver/index.js +281 -0
  231. package/dist/screenReceiver/index.js.map +1 -0
  232. package/dist/screenReceiver/index.mjs +273 -0
  233. package/dist/screenReceiver/index.mjs.map +1 -0
  234. package/dist/testYourself/admin/index.d.mts +58 -0
  235. package/dist/testYourself/admin/index.d.ts +58 -0
  236. package/dist/testYourself/admin/index.js +1009 -0
  237. package/dist/testYourself/admin/index.js.map +1 -0
  238. package/dist/testYourself/admin/index.mjs +1002 -0
  239. package/dist/testYourself/admin/index.mjs.map +1 -0
  240. package/dist/testYourself/index.d.mts +53 -0
  241. package/dist/testYourself/index.d.ts +53 -0
  242. package/dist/testYourself/index.js +2551 -0
  243. package/dist/testYourself/index.js.map +1 -0
  244. package/dist/testYourself/index.mjs +2531 -0
  245. package/dist/testYourself/index.mjs.map +1 -0
  246. package/dist/testYourself/server/index.d.mts +1029 -0
  247. package/dist/testYourself/server/index.d.ts +1029 -0
  248. package/dist/testYourself/server/index.js +825 -0
  249. package/dist/testYourself/server/index.js.map +1 -0
  250. package/dist/testYourself/server/index.mjs +816 -0
  251. package/dist/testYourself/server/index.mjs.map +1 -0
  252. package/dist/types-BTiaMsBz.d.mts +292 -0
  253. package/dist/types-DyG3ZV9V.d.mts +270 -0
  254. package/dist/types-DyG3ZV9V.d.ts +270 -0
  255. package/dist/types-ERmJyjx8.d.ts +292 -0
  256. package/dist/types-HorDyIRv.d.mts +303 -0
  257. package/dist/types-HorDyIRv.d.ts +303 -0
  258. package/dist/types-tQfupO6d.d.mts +70 -0
  259. package/dist/types-tQfupO6d.d.ts +70 -0
  260. package/dist/vocaloidBooth/index.d.mts +64 -0
  261. package/dist/vocaloidBooth/index.d.ts +64 -0
  262. package/dist/vocaloidBooth/index.js +376 -0
  263. package/dist/vocaloidBooth/index.js.map +1 -0
  264. package/dist/vocaloidBooth/index.mjs +362 -0
  265. package/dist/vocaloidBooth/index.mjs.map +1 -0
  266. package/dist/vocaloidBooth/server/index.d.mts +111 -0
  267. package/dist/vocaloidBooth/server/index.d.ts +111 -0
  268. package/dist/vocaloidBooth/server/index.js +247 -0
  269. package/dist/vocaloidBooth/server/index.js.map +1 -0
  270. package/dist/vocaloidBooth/server/index.mjs +237 -0
  271. package/dist/vocaloidBooth/server/index.mjs.map +1 -0
  272. package/dist/vocaloidBooth/web/index.d.mts +3 -0
  273. package/dist/vocaloidBooth/web/index.d.ts +3 -0
  274. package/dist/vocaloidBooth/web/index.js +376 -0
  275. package/dist/vocaloidBooth/web/index.js.map +1 -0
  276. package/dist/vocaloidBooth/web/index.mjs +362 -0
  277. package/dist/vocaloidBooth/web/index.mjs.map +1 -0
  278. package/package.json +11 -1
@@ -0,0 +1,250 @@
1
+ import { pgTable, timestamp, varchar, boolean, serial, integer, text } from 'drizzle-orm/pg-core';
2
+ import { relations, eq, and, gt, lt } from 'drizzle-orm';
3
+ import { randomBytes } from 'crypto';
4
+ import bcrypt from 'bcryptjs';
5
+
6
+ // src/business/auth-legacy/schema/index.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
+ var legacyUsersRelations = relations(legacyUsers, ({ many }) => ({
35
+ sessions: many(legacyUserSessions)
36
+ }));
37
+ var legacyUserSessionsRelations = relations(legacyUserSessions, ({ one }) => ({
38
+ user: one(legacyUsers, {
39
+ fields: [legacyUserSessions.userId],
40
+ references: [legacyUsers.id]
41
+ })
42
+ }));
43
+ var LegacyAuthDbService = class {
44
+ constructor(config) {
45
+ this.db = config.db;
46
+ this.tables = {
47
+ users: config.tables?.users ?? legacyUsers,
48
+ userSessions: config.tables?.userSessions ?? legacyUserSessions,
49
+ verificationCodes: config.tables?.verificationCodes ?? legacyVerificationCodes
50
+ };
51
+ this.saltRounds = config.saltRounds || 12;
52
+ this.sessionDurationMs = config.sessionDurationMs || 30 * 24 * 60 * 60 * 1e3;
53
+ }
54
+ async verifyPassword(phone, password) {
55
+ try {
56
+ const result = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
57
+ const user = result[0];
58
+ if (!user) return null;
59
+ if (!user.isActive) return null;
60
+ const isValid = await bcrypt.compare(password, user.password);
61
+ if (!isValid) return null;
62
+ const { password: _, ...userWithoutPassword } = user;
63
+ return userWithoutPassword;
64
+ } catch (error) {
65
+ console.error("\u{1F4A5} [LegacyAuthDbService] \u5BC6\u7801\u9A8C\u8BC1\u5F02\u5E38:", error);
66
+ return null;
67
+ }
68
+ }
69
+ async createUser(phone, password, name) {
70
+ try {
71
+ const existingUser = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
72
+ if (existingUser.length > 0) {
73
+ throw new Error("\u7528\u6237\u5DF2\u5B58\u5728");
74
+ }
75
+ const hashedPassword = await bcrypt.hash(password, this.saltRounds);
76
+ const result = await this.db.insert(this.tables.users).values({
77
+ phone,
78
+ password: hashedPassword,
79
+ name: name || null,
80
+ isActive: true,
81
+ role: "user"
82
+ }).returning();
83
+ const createdUser = result[0];
84
+ if (!createdUser) {
85
+ throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25: \u672A\u8FD4\u56DE\u7528\u6237\u8BB0\u5F55");
86
+ }
87
+ const { password: _, ...userWithoutPassword } = createdUser;
88
+ return userWithoutPassword;
89
+ } catch (error) {
90
+ console.error("\u521B\u5EFA\u7528\u6237\u5931\u8D25:", error);
91
+ throw new Error("\u521B\u5EFA\u7528\u6237\u5931\u8D25");
92
+ }
93
+ }
94
+ async updateLastLogin(userId) {
95
+ try {
96
+ await this.db.update(this.tables.users).set({ lastLoginAt: /* @__PURE__ */ new Date(), updatedAt: /* @__PURE__ */ new Date() }).where(eq(this.tables.users.id, userId));
97
+ } catch (error) {
98
+ console.error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25:", error);
99
+ throw new Error("\u66F4\u65B0\u6700\u540E\u767B\u5F55\u65F6\u95F4\u5931\u8D25");
100
+ }
101
+ }
102
+ async createSession(userId) {
103
+ try {
104
+ const sessionToken = randomBytes(32).toString("hex");
105
+ const expiresAt = new Date(Date.now() + this.sessionDurationMs);
106
+ const result = await this.db.insert(this.tables.userSessions).values({
107
+ userId,
108
+ sessionToken,
109
+ expiresAt
110
+ }).returning();
111
+ const session = result[0];
112
+ if (!session) {
113
+ throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25: \u672A\u8FD4\u56DE\u4F1A\u8BDD\u8BB0\u5F55");
114
+ }
115
+ return session;
116
+ } catch (error) {
117
+ console.error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25:", error);
118
+ throw new Error("\u521B\u5EFA\u4F1A\u8BDD\u5931\u8D25");
119
+ }
120
+ }
121
+ async validateSession(sessionToken) {
122
+ try {
123
+ const now = /* @__PURE__ */ new Date();
124
+ const result = await this.db.select({
125
+ session: this.tables.userSessions,
126
+ user: this.tables.users
127
+ }).from(this.tables.userSessions).innerJoin(this.tables.users, eq(this.tables.userSessions.userId, this.tables.users.id)).where(
128
+ and(
129
+ eq(this.tables.userSessions.sessionToken, sessionToken),
130
+ gt(this.tables.userSessions.expiresAt, now),
131
+ eq(this.tables.users.isActive, true)
132
+ )
133
+ ).limit(1);
134
+ const row = result[0];
135
+ if (!row) {
136
+ return { valid: false };
137
+ }
138
+ const { password: _, ...userWithoutPassword } = row.user;
139
+ return { valid: true, user: userWithoutPassword };
140
+ } catch (error) {
141
+ console.error("\u4F1A\u8BDD\u9A8C\u8BC1\u5931\u8D25:", error);
142
+ return { valid: false };
143
+ }
144
+ }
145
+ async deleteSession(sessionToken) {
146
+ try {
147
+ await this.db.delete(this.tables.userSessions).where(eq(this.tables.userSessions.sessionToken, sessionToken));
148
+ } catch (error) {
149
+ console.error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25:", error);
150
+ throw new Error("\u5220\u9664\u4F1A\u8BDD\u5931\u8D25");
151
+ }
152
+ }
153
+ async deleteUserSessions(userId) {
154
+ try {
155
+ await this.db.delete(this.tables.userSessions).where(eq(this.tables.userSessions.userId, userId));
156
+ } catch (error) {
157
+ console.error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25:", error);
158
+ throw new Error("\u5220\u9664\u7528\u6237\u4F1A\u8BDD\u5931\u8D25");
159
+ }
160
+ }
161
+ async cleanupExpiredSessions() {
162
+ try {
163
+ const now = /* @__PURE__ */ new Date();
164
+ await this.db.delete(this.tables.userSessions).where(lt(this.tables.userSessions.expiresAt, now));
165
+ } catch (error) {
166
+ console.error("\u6E05\u7406\u8FC7\u671F\u4F1A\u8BDD\u5931\u8D25:", error);
167
+ }
168
+ }
169
+ async getUserByPhone(phone) {
170
+ try {
171
+ const result = await this.db.select().from(this.tables.users).where(eq(this.tables.users.phone, phone)).limit(1);
172
+ const user = result[0];
173
+ if (!user) return null;
174
+ const { password: _, ...userWithoutPassword } = user;
175
+ return userWithoutPassword;
176
+ } catch (error) {
177
+ console.error("\u67E5\u8BE2\u7528\u6237\u5931\u8D25:", error);
178
+ throw error;
179
+ }
180
+ }
181
+ async sendVerificationCode(phone) {
182
+ try {
183
+ await this.cleanupExpiredVerificationCodes();
184
+ const existingCode = await this.db.select().from(this.tables.verificationCodes).where(
185
+ and(
186
+ eq(this.tables.verificationCodes.phone, phone),
187
+ eq(this.tables.verificationCodes.used, false),
188
+ gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
189
+ )
190
+ ).limit(1);
191
+ const currentCode = existingCode[0];
192
+ if (currentCode) {
193
+ const timeDiff = Date.now() - currentCode.createdAt.getTime();
194
+ if (timeDiff < 60 * 1e3) {
195
+ throw new Error("\u9A8C\u8BC1\u7801\u53D1\u9001\u8FC7\u4E8E\u9891\u7E41\uFF0C\u8BF7\u7A0D\u540E\u518D\u8BD5");
196
+ }
197
+ }
198
+ const code = Math.floor(1e5 + Math.random() * 9e5).toString();
199
+ await this.db.insert(this.tables.verificationCodes).values({
200
+ phone,
201
+ code,
202
+ expiresAt: new Date(Date.now() + 10 * 60 * 1e3)
203
+ }).returning();
204
+ return code;
205
+ } catch (error) {
206
+ console.error("\u53D1\u9001\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
207
+ throw error;
208
+ }
209
+ }
210
+ async verifyCode(phone, code) {
211
+ try {
212
+ const result = await this.db.select().from(this.tables.verificationCodes).where(
213
+ and(
214
+ eq(this.tables.verificationCodes.phone, phone),
215
+ eq(this.tables.verificationCodes.code, code),
216
+ eq(this.tables.verificationCodes.used, false),
217
+ gt(this.tables.verificationCodes.expiresAt, /* @__PURE__ */ new Date())
218
+ )
219
+ ).limit(1);
220
+ const verificationCode = result[0];
221
+ if (!verificationCode) return false;
222
+ await this.db.update(this.tables.verificationCodes).set({ used: true }).where(eq(this.tables.verificationCodes.id, verificationCode.id));
223
+ return true;
224
+ } catch (error) {
225
+ console.error("\u9A8C\u8BC1\u7801\u9A8C\u8BC1\u5931\u8D25:", error);
226
+ throw error;
227
+ }
228
+ }
229
+ async resetPassword(phone, newPassword) {
230
+ try {
231
+ const hashedPassword = await bcrypt.hash(newPassword, this.saltRounds);
232
+ await this.db.update(this.tables.users).set({ password: hashedPassword }).where(eq(this.tables.users.phone, phone));
233
+ } catch (error) {
234
+ console.error("\u5BC6\u7801\u91CD\u7F6E\u5931\u8D25:", error);
235
+ throw error;
236
+ }
237
+ }
238
+ async cleanupExpiredVerificationCodes() {
239
+ try {
240
+ const now = /* @__PURE__ */ new Date();
241
+ await this.db.delete(this.tables.verificationCodes).where(lt(this.tables.verificationCodes.expiresAt, now)).returning();
242
+ } catch (error) {
243
+ console.error("\u6E05\u7406\u8FC7\u671F\u9A8C\u8BC1\u7801\u5931\u8D25:", error);
244
+ }
245
+ }
246
+ };
247
+
248
+ export { LegacyAuthDbService, legacyUserSessions, legacyUserSessionsRelations, legacyUsers, legacyUsersRelations, legacyVerificationCodes };
249
+ //# sourceMappingURL=index.mjs.map
250
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,5 @@
1
+ export { AuthGuard, ForgotPasswordModal, LoginModal, RegisterModal, UserMenu } from './ui/web/index.mjs';
2
+ export { AuthProvider, useAuth } from './logic/index.mjs';
3
+ export { A as AuthGuardProps, i as AuthService, C as CustomMenuItem, F as ForgotPasswordModalProps, e as LoginModalProps, L as LoginRequest, b as LoginResponse, f as RegisterModalProps, R as RegisterRequest, c as RegisterResponse, k as SessionConfig, d as SessionValidation, S as SessionValidationResponse, h as UseAuthReturn, U as User, g as UserMenuProps, j as UserRole, a as UserSession, V as ValidateApiAuth } from '../../index-DNKZ7-R_.mjs';
4
+ export { calculateSessionExpiry, generateSessionToken, getUserDisplayName, isActiveUser, isAdmin, isSessionExpired, validatePassword, validatePhoneNumber } from './core/index.mjs';
5
+ import 'react';
@@ -0,0 +1,5 @@
1
+ export { AuthGuard, ForgotPasswordModal, LoginModal, RegisterModal, UserMenu } from './ui/web/index.js';
2
+ export { AuthProvider, useAuth } from './logic/index.js';
3
+ export { A as AuthGuardProps, i as AuthService, C as CustomMenuItem, F as ForgotPasswordModalProps, e as LoginModalProps, L as LoginRequest, b as LoginResponse, f as RegisterModalProps, R as RegisterRequest, c as RegisterResponse, k as SessionConfig, d as SessionValidation, S as SessionValidationResponse, h as UseAuthReturn, U as User, g as UserMenuProps, j as UserRole, a as UserSession, V as ValidateApiAuth } from '../../index-DNKZ7-R_.js';
4
+ export { calculateSessionExpiry, generateSessionToken, getUserDisplayName, isActiveUser, isAdmin, isSessionExpired, validatePassword, validatePhoneNumber } from './core/index.js';
5
+ import 'react';