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,755 @@
1
+ 'use strict';
2
+
3
+ var server = require('next/server');
4
+ var drizzleOrm = require('drizzle-orm');
5
+ var pgCore = require('drizzle-orm/pg-core');
6
+
7
+ // src/calendar/routes/index.ts
8
+ var userRole = pgCore.pgEnum("UserRole", ["USER", "ADMIN", "SUPER_ADMIN"]);
9
+ var user = pgCore.pgTable(
10
+ "User",
11
+ {
12
+ id: pgCore.text().primaryKey().notNull(),
13
+ email: pgCore.text().notNull(),
14
+ emailVerified: pgCore.boolean().default(false).notNull(),
15
+ username: pgCore.text().notNull(),
16
+ password: pgCore.text(),
17
+ name: pgCore.text(),
18
+ nickname: pgCore.text(),
19
+ image: pgCore.text(),
20
+ avatar: pgCore.text(),
21
+ role: userRole().default("USER").notNull(),
22
+ preferences: pgCore.jsonb(),
23
+ createdAt: pgCore.timestamp({ precision: 3, mode: "string" }).default(drizzleOrm.sql`CURRENT_TIMESTAMP`).notNull(),
24
+ updatedAt: pgCore.timestamp({ precision: 3, mode: "string" }).notNull(),
25
+ twoFactorEnabled: pgCore.boolean().default(false).notNull()
26
+ },
27
+ (table) => [
28
+ pgCore.uniqueIndex("User_email_key").using("btree", table.email.asc().nullsLast().op("text_ops")),
29
+ pgCore.uniqueIndex("User_username_key").using(
30
+ "btree",
31
+ table.username.asc().nullsLast().op("text_ops")
32
+ )
33
+ ]
34
+ );
35
+ var session = pgCore.pgTable(
36
+ "Session",
37
+ {
38
+ id: pgCore.text().primaryKey().notNull(),
39
+ userId: pgCore.text().notNull(),
40
+ token: pgCore.text().notNull(),
41
+ expiresAt: pgCore.timestamp({ precision: 3, mode: "string" }).notNull(),
42
+ ipAddress: pgCore.text(),
43
+ userAgent: pgCore.text(),
44
+ createdAt: pgCore.timestamp({ precision: 3, mode: "string" }).default(drizzleOrm.sql`CURRENT_TIMESTAMP`).notNull(),
45
+ updatedAt: pgCore.timestamp({ precision: 3, mode: "string" }).default(drizzleOrm.sql`CURRENT_TIMESTAMP`).notNull()
46
+ },
47
+ (table) => [
48
+ pgCore.uniqueIndex("Session_token_key").using("btree", table.token.asc().nullsLast().op("text_ops")),
49
+ pgCore.foreignKey({
50
+ columns: [table.userId],
51
+ foreignColumns: [user.id],
52
+ name: "Session_userId_fkey"
53
+ }).onUpdate("cascade").onDelete("cascade")
54
+ ]
55
+ );
56
+ var account = pgCore.pgTable(
57
+ "Account",
58
+ {
59
+ id: pgCore.text().primaryKey().notNull(),
60
+ accountId: pgCore.text().notNull(),
61
+ providerId: pgCore.text().notNull(),
62
+ // 提供商: github, google, wechat 等
63
+ userId: pgCore.text().notNull(),
64
+ accessToken: pgCore.text(),
65
+ refreshToken: pgCore.text(),
66
+ idToken: pgCore.text(),
67
+ accessTokenExpiresAt: pgCore.timestamp({ precision: 3, mode: "string" }),
68
+ refreshTokenExpiresAt: pgCore.timestamp({ precision: 3, mode: "string" }),
69
+ scope: pgCore.text(),
70
+ password: pgCore.text(),
71
+ createdAt: pgCore.timestamp({ precision: 3, mode: "string" }).default(drizzleOrm.sql`CURRENT_TIMESTAMP`).notNull(),
72
+ updatedAt: pgCore.timestamp({ precision: 3, mode: "string" }).notNull()
73
+ },
74
+ (table) => [
75
+ pgCore.uniqueIndex("Account_providerId_accountId_key").using(
76
+ "btree",
77
+ table.providerId.asc().nullsLast().op("text_ops"),
78
+ table.accountId.asc().nullsLast().op("text_ops")
79
+ ),
80
+ pgCore.foreignKey({
81
+ columns: [table.userId],
82
+ foreignColumns: [user.id],
83
+ name: "Account_userId_fkey"
84
+ }).onUpdate("cascade").onDelete("cascade")
85
+ ]
86
+ );
87
+ pgCore.pgTable(
88
+ "verifications",
89
+ {
90
+ id: pgCore.text().primaryKey().notNull(),
91
+ identifier: pgCore.text().notNull(),
92
+ // 邮箱或手机号
93
+ value: pgCore.text().notNull(),
94
+ // 验证码
95
+ expiresAt: pgCore.timestamp({ precision: 3, mode: "string" }).notNull(),
96
+ createdAt: pgCore.timestamp({ precision: 3, mode: "string" }).default(drizzleOrm.sql`CURRENT_TIMESTAMP`).notNull()
97
+ },
98
+ (table) => [
99
+ pgCore.uniqueIndex("verifications_identifier_value_key").using(
100
+ "btree",
101
+ table.identifier.asc().nullsLast().op("text_ops"),
102
+ table.value.asc().nullsLast().op("text_ops")
103
+ )
104
+ ]
105
+ );
106
+ drizzleOrm.relations(user, ({ many }) => ({
107
+ sessions: many(session),
108
+ accounts: many(account)
109
+ }));
110
+ drizzleOrm.relations(session, ({ one }) => ({
111
+ user: one(user, {
112
+ fields: [session.userId],
113
+ references: [user.id]
114
+ })
115
+ }));
116
+ drizzleOrm.relations(account, ({ one }) => ({
117
+ user: one(user, {
118
+ fields: [account.userId],
119
+ references: [user.id]
120
+ })
121
+ }));
122
+
123
+ // src/calendar/db/schema.ts
124
+ var calendarEvents = pgCore.pgTable("calendar_events", {
125
+ id: pgCore.serial("id").primaryKey(),
126
+ title: pgCore.varchar("title", { length: 255 }).notNull(),
127
+ description: pgCore.text("description"),
128
+ startTime: pgCore.timestamp("start_time").notNull(),
129
+ endTime: pgCore.timestamp("end_time").notNull(),
130
+ allDay: pgCore.boolean("all_day").notNull().default(false),
131
+ location: pgCore.varchar("location", { length: 500 }),
132
+ color: pgCore.varchar("color", { length: 7 }).notNull().default("#3B82F6"),
133
+ // 十六进制颜色值
134
+ priority: pgCore.varchar("priority", { length: 10 }).notNull().default("normal"),
135
+ // low, normal, high, urgent
136
+ userId: pgCore.integer("user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
137
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
138
+ updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
139
+ });
140
+ var recurrenceRules = pgCore.pgTable("recurrence_rules", {
141
+ id: pgCore.serial("id").primaryKey(),
142
+ eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
143
+ ruleType: pgCore.varchar("rule_type", { length: 20 }).notNull(),
144
+ // daily, weekly, monthly, yearly, custom
145
+ interval: pgCore.integer("interval").notNull().default(1),
146
+ // 间隔
147
+ endDate: pgCore.timestamp("end_date"),
148
+ // 结束日期
149
+ count: pgCore.integer("count"),
150
+ // 重复次数
151
+ byWeekday: pgCore.json("by_weekday").$type(),
152
+ // 周几重复 [0,1,2,3,4,5,6],0=周日
153
+ byMonthday: pgCore.json("by_monthday").$type(),
154
+ // 月中的第几天 [1,2,...,31]
155
+ byMonth: pgCore.json("by_month").$type(),
156
+ // 第几月 [1,2,...,12]
157
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
158
+ });
159
+ var reminders = pgCore.pgTable("reminders", {
160
+ id: pgCore.serial("id").primaryKey(),
161
+ eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
162
+ reminderTime: pgCore.timestamp("reminder_time").notNull(),
163
+ // 提醒时间
164
+ reminderType: pgCore.varchar("reminder_type", { length: 20 }).notNull(),
165
+ // notification, email, sms
166
+ status: pgCore.varchar("status", { length: 20 }).notNull().default("pending"),
167
+ // pending, sent, failed
168
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
169
+ updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
170
+ });
171
+ var calendarConfigs = pgCore.pgTable("calendar_configs", {
172
+ id: pgCore.serial("id").primaryKey(),
173
+ userId: pgCore.integer("user_id").notNull().references(() => user.id, { onDelete: "cascade" }).unique(),
174
+ firstDayOfWeek: pgCore.integer("first_day_of_week").notNull().default(1),
175
+ // 0=周日, 1=周一
176
+ workingHoursStart: pgCore.varchar("working_hours_start", { length: 5 }).notNull().default("09:00"),
177
+ workingHoursEnd: pgCore.varchar("working_hours_end", { length: 5 }).notNull().default("18:00"),
178
+ timeZone: pgCore.varchar("time_zone", { length: 50 }).notNull().default("Asia/Shanghai"),
179
+ dateFormat: pgCore.varchar("date_format", { length: 20 }).notNull().default("YYYY-MM-DD"),
180
+ timeFormat: pgCore.varchar("time_format", { length: 20 }).notNull().default("HH:mm"),
181
+ defaultView: pgCore.varchar("default_view", { length: 20 }).notNull().default("month"),
182
+ // month, week, day, agenda
183
+ defaultEventColor: pgCore.varchar("default_event_color", { length: 7 }).notNull().default("#3B82F6"),
184
+ weekends: pgCore.boolean("weekends").notNull().default(true),
185
+ eventColors: pgCore.json("event_colors").$type().default({
186
+ blue: "#3B82F6",
187
+ green: "#10B981",
188
+ purple: "#8B5CF6",
189
+ red: "#EF4444",
190
+ yellow: "#F59E0B",
191
+ pink: "#EC4899",
192
+ indigo: "#6366F1",
193
+ gray: "#6B7280"
194
+ }),
195
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
196
+ updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
197
+ });
198
+ var eventShares = pgCore.pgTable("event_shares", {
199
+ id: pgCore.serial("id").primaryKey(),
200
+ eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
201
+ sharedWithUserId: pgCore.integer("shared_with_user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
202
+ sharedByUserId: pgCore.integer("shared_by_user_id").notNull().references(() => user.id, { onDelete: "cascade" }),
203
+ permission: pgCore.varchar("permission", { length: 20 }).notNull().default("read"),
204
+ // read, write
205
+ createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
206
+ });
207
+ drizzleOrm.relations(calendarEvents, ({ one, many }) => ({
208
+ user: one(user, {
209
+ fields: [calendarEvents.userId],
210
+ references: [user.id]
211
+ }),
212
+ recurrenceRule: one(recurrenceRules, {
213
+ fields: [calendarEvents.id],
214
+ references: [recurrenceRules.eventId]
215
+ }),
216
+ reminders: many(reminders),
217
+ shares: many(eventShares)
218
+ }));
219
+ drizzleOrm.relations(recurrenceRules, ({ one }) => ({
220
+ event: one(calendarEvents, {
221
+ fields: [recurrenceRules.eventId],
222
+ references: [calendarEvents.id]
223
+ })
224
+ }));
225
+ drizzleOrm.relations(reminders, ({ one }) => ({
226
+ event: one(calendarEvents, {
227
+ fields: [reminders.eventId],
228
+ references: [calendarEvents.id]
229
+ })
230
+ }));
231
+ drizzleOrm.relations(calendarConfigs, ({ one }) => ({
232
+ user: one(user, {
233
+ fields: [calendarConfigs.userId],
234
+ references: [user.id]
235
+ })
236
+ }));
237
+ drizzleOrm.relations(eventShares, ({ one }) => ({
238
+ event: one(calendarEvents, {
239
+ fields: [eventShares.eventId],
240
+ references: [calendarEvents.id]
241
+ }),
242
+ sharedWithUser: one(user, {
243
+ fields: [eventShares.sharedWithUserId],
244
+ references: [user.id]
245
+ }),
246
+ sharedByUser: one(user, {
247
+ fields: [eventShares.sharedByUserId],
248
+ references: [user.id]
249
+ })
250
+ }));
251
+
252
+ // src/calendar/db/calendarDbService.ts
253
+ var CalendarDbService = class {
254
+ /**
255
+ * 设置数据库实例
256
+ */
257
+ setDb(db) {
258
+ this._db = db;
259
+ }
260
+ /**
261
+ * 数据库是否已初始化
262
+ */
263
+ isConfigured() {
264
+ return Boolean(this._db);
265
+ }
266
+ /**
267
+ * 获取数据库实例
268
+ */
269
+ get db() {
270
+ if (!this._db) {
271
+ throw new Error("CalendarDbService: Database instance not set. Call setDb() first.");
272
+ }
273
+ return this._db;
274
+ }
275
+ // ===== 事件基础操作 =====
276
+ /**
277
+ * 获取用户的所有事件(基础版本)
278
+ */
279
+ async getAllEvents(userId, startDate, endDate) {
280
+ const conditions = [drizzleOrm.eq(calendarEvents.userId, userId)];
281
+ if (startDate) {
282
+ conditions.push(drizzleOrm.gte(calendarEvents.startTime, startDate));
283
+ }
284
+ if (endDate) {
285
+ conditions.push(drizzleOrm.lte(calendarEvents.endTime, endDate));
286
+ }
287
+ const events = await this.db.select().from(calendarEvents).where(drizzleOrm.and(...conditions)).orderBy(drizzleOrm.asc(calendarEvents.startTime));
288
+ return events;
289
+ }
290
+ /**
291
+ * 根据ID获取事件
292
+ */
293
+ async getEventById(eventId) {
294
+ const [event] = await this.db.select().from(calendarEvents).where(drizzleOrm.eq(calendarEvents.id, eventId)).limit(1);
295
+ return event || null;
296
+ }
297
+ /**
298
+ * 创建事件(基础版本)
299
+ */
300
+ async createEvent(eventData) {
301
+ const [newEvent] = await this.db.insert(calendarEvents).values(eventData).returning();
302
+ return newEvent;
303
+ }
304
+ /**
305
+ * 更新事件
306
+ */
307
+ async updateEvent(eventId, eventData) {
308
+ const updateData = {
309
+ ...eventData,
310
+ updatedAt: /* @__PURE__ */ new Date()
311
+ };
312
+ const [updatedEvent] = await this.db.update(calendarEvents).set(updateData).where(drizzleOrm.eq(calendarEvents.id, eventId)).returning();
313
+ return updatedEvent;
314
+ }
315
+ /**
316
+ * 删除事件
317
+ */
318
+ async deleteEvent(eventId) {
319
+ await this.db.delete(calendarEvents).where(drizzleOrm.eq(calendarEvents.id, eventId));
320
+ }
321
+ // ===== 用户配置操作 =====
322
+ /**
323
+ * 获取用户的日历配置
324
+ */
325
+ async getUserConfig(userId) {
326
+ const [config] = await this.db.select().from(calendarConfigs).where(drizzleOrm.eq(calendarConfigs.userId, userId)).limit(1);
327
+ return config || null;
328
+ }
329
+ /**
330
+ * 创建或更新用户配置
331
+ */
332
+ async upsertUserConfig(userId, configData) {
333
+ const existingConfig = await this.getUserConfig(userId);
334
+ if (existingConfig) {
335
+ const [updatedConfig] = await this.db.update(calendarConfigs).set({
336
+ ...configData,
337
+ updatedAt: /* @__PURE__ */ new Date()
338
+ }).where(drizzleOrm.eq(calendarConfigs.userId, userId)).returning();
339
+ return updatedConfig;
340
+ } else {
341
+ const [newConfig] = await this.db.insert(calendarConfigs).values({
342
+ userId,
343
+ ...configData
344
+ }).returning();
345
+ return newConfig;
346
+ }
347
+ }
348
+ /**
349
+ * 为事件创建重复规则
350
+ */
351
+ async createRecurrenceRule(ruleData) {
352
+ const [newRule] = await this.db.insert(recurrenceRules).values(ruleData).returning();
353
+ return newRule;
354
+ }
355
+ /**
356
+ * 获取事件的重复规则
357
+ */
358
+ async getRecurrenceRule(eventId) {
359
+ const [rule] = await this.db.select().from(recurrenceRules).where(drizzleOrm.eq(recurrenceRules.eventId, eventId)).limit(1);
360
+ return rule || null;
361
+ }
362
+ /**
363
+ * 删除重复规则
364
+ */
365
+ async deleteRecurrenceRule(eventId) {
366
+ await this.db.delete(recurrenceRules).where(drizzleOrm.eq(recurrenceRules.eventId, eventId));
367
+ }
368
+ /**
369
+ * 为事件创建提醒
370
+ */
371
+ async createReminder(reminderData) {
372
+ const [newReminder] = await this.db.insert(reminders).values({
373
+ ...reminderData,
374
+ status: reminderData.status || "pending"
375
+ }).returning();
376
+ return newReminder;
377
+ }
378
+ /**
379
+ * 获取事件的提醒列表
380
+ */
381
+ async getEventReminders(eventId) {
382
+ const remindersList = await this.db.select().from(reminders).where(drizzleOrm.eq(reminders.eventId, eventId)).orderBy(drizzleOrm.asc(reminders.reminderTime));
383
+ return remindersList;
384
+ }
385
+ /**
386
+ * 删除事件的所有提醒
387
+ */
388
+ async deleteEventReminders(eventId) {
389
+ await this.db.delete(reminders).where(drizzleOrm.eq(reminders.eventId, eventId));
390
+ }
391
+ /**
392
+ * 获取用户在指定时间范围内的事件数量
393
+ */
394
+ async getEventCount(userId, startDate, endDate) {
395
+ const conditions = [drizzleOrm.eq(calendarEvents.userId, userId)];
396
+ if (startDate) {
397
+ conditions.push(drizzleOrm.gte(calendarEvents.startTime, startDate));
398
+ }
399
+ if (endDate) {
400
+ conditions.push(drizzleOrm.lte(calendarEvents.endTime, endDate));
401
+ }
402
+ const result = await this.db.select({ count: calendarEvents.id }).from(calendarEvents).where(drizzleOrm.and(...conditions));
403
+ return result.length;
404
+ }
405
+ /**
406
+ * 搜索事件
407
+ */
408
+ async searchEvents(userId, searchTerm) {
409
+ const events = await this.db.select().from(calendarEvents).where(
410
+ drizzleOrm.and(
411
+ drizzleOrm.eq(calendarEvents.userId, userId)
412
+ )
413
+ ).orderBy(drizzleOrm.desc(calendarEvents.startTime));
414
+ return events.filter(
415
+ (event) => event.title.toLowerCase().includes(searchTerm.toLowerCase()) || event.description && event.description.toLowerCase().includes(searchTerm.toLowerCase())
416
+ );
417
+ }
418
+ /**
419
+ * 批量删除用户的所有事件
420
+ */
421
+ async deleteAllUserEvents(userId) {
422
+ await this.db.delete(calendarEvents).where(drizzleOrm.eq(calendarEvents.userId, userId));
423
+ }
424
+ };
425
+ var calendarDbService = new CalendarDbService();
426
+
427
+ // src/calendar/routes/index.ts
428
+ function initDbService(db) {
429
+ if (db) {
430
+ calendarDbService.setDb(db);
431
+ }
432
+ }
433
+ function createGetEventsHandler(config) {
434
+ initDbService(config.db);
435
+ return async (request) => {
436
+ try {
437
+ const user2 = await config.validateAuth(request);
438
+ if (!user2) {
439
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
440
+ }
441
+ const { searchParams } = new URL(request.url);
442
+ const startDateStr = searchParams.get("startDate");
443
+ const endDateStr = searchParams.get("endDate");
444
+ let startDate;
445
+ let endDate;
446
+ if (startDateStr) {
447
+ startDate = new Date(startDateStr);
448
+ if (isNaN(startDate.getTime())) {
449
+ return server.NextResponse.json({ success: false, error: "\u5F00\u59CB\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
450
+ }
451
+ }
452
+ if (endDateStr) {
453
+ endDate = new Date(endDateStr);
454
+ if (isNaN(endDate.getTime())) {
455
+ return server.NextResponse.json({ success: false, error: "\u7ED3\u675F\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
456
+ }
457
+ }
458
+ const events = await calendarDbService.getAllEvents(user2.id, startDate, endDate);
459
+ return server.NextResponse.json({
460
+ success: true,
461
+ data: events,
462
+ message: "\u83B7\u53D6\u4E8B\u4EF6\u5217\u8868\u6210\u529F"
463
+ });
464
+ } catch (error) {
465
+ console.error("\u83B7\u53D6\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
466
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
467
+ }
468
+ };
469
+ }
470
+ function createCreateEventHandler(config) {
471
+ initDbService(config.db);
472
+ return async (request) => {
473
+ try {
474
+ const user2 = await config.validateAuth(request);
475
+ if (!user2) {
476
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
477
+ }
478
+ const body = await request.json();
479
+ if (!body.title || typeof body.title !== "string" || body.title.trim() === "") {
480
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
481
+ }
482
+ if (!body.startTime || !body.endTime) {
483
+ return server.NextResponse.json({ success: false, error: "\u5F00\u59CB\u65F6\u95F4\u548C\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
484
+ }
485
+ const startTime = new Date(body.startTime);
486
+ const endTime = new Date(body.endTime);
487
+ if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {
488
+ return server.NextResponse.json({ success: false, error: "\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
489
+ }
490
+ if (startTime.getTime() >= endTime.getTime()) {
491
+ return server.NextResponse.json({ success: false, error: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4" }, { status: 400 });
492
+ }
493
+ const eventData = {
494
+ title: body.title.trim(),
495
+ description: body.description || null,
496
+ startTime,
497
+ endTime,
498
+ allDay: Boolean(body.allDay),
499
+ location: body.location || null,
500
+ color: body.color || "#3B82F6",
501
+ userId: user2.id
502
+ };
503
+ const newEvent = await calendarDbService.createEvent(eventData);
504
+ if (body.recurrence) {
505
+ await calendarDbService.createRecurrenceRule({
506
+ eventId: newEvent.id,
507
+ ...body.recurrence,
508
+ endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
509
+ });
510
+ }
511
+ if (body.reminders && Array.isArray(body.reminders)) {
512
+ for (const reminder of body.reminders) {
513
+ if (reminder.reminderTime) {
514
+ await calendarDbService.createReminder({
515
+ eventId: newEvent.id,
516
+ reminderTime: new Date(reminder.reminderTime),
517
+ reminderType: reminder.reminderType || "notification",
518
+ status: "pending"
519
+ });
520
+ }
521
+ }
522
+ }
523
+ return server.NextResponse.json({
524
+ success: true,
525
+ data: newEvent,
526
+ message: "\u521B\u5EFA\u4E8B\u4EF6\u6210\u529F"
527
+ });
528
+ } catch (error) {
529
+ console.error("\u521B\u5EFA\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
530
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
531
+ }
532
+ };
533
+ }
534
+ function createGetEventByIdHandler(config) {
535
+ initDbService(config.db);
536
+ return async (request, { params }) => {
537
+ try {
538
+ const user2 = await config.validateAuth(request);
539
+ if (!user2) {
540
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
541
+ }
542
+ const eventId = parseInt(params.id);
543
+ if (isNaN(eventId)) {
544
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
545
+ }
546
+ const event = await calendarDbService.getEventById(eventId);
547
+ if (!event) {
548
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728" }, { status: 404 });
549
+ }
550
+ if (event.userId !== user2.id) {
551
+ return server.NextResponse.json({ success: false, error: "\u65E0\u6743\u8BBF\u95EE\u6B64\u4E8B\u4EF6" }, { status: 403 });
552
+ }
553
+ const [recurrenceRule, reminders2] = await Promise.all([
554
+ calendarDbService.getRecurrenceRule(eventId),
555
+ calendarDbService.getEventReminders(eventId)
556
+ ]);
557
+ return server.NextResponse.json({
558
+ success: true,
559
+ data: {
560
+ ...event,
561
+ recurrenceRule: recurrenceRule || void 0,
562
+ reminders: reminders2 || []
563
+ },
564
+ message: "\u83B7\u53D6\u4E8B\u4EF6\u6210\u529F"
565
+ });
566
+ } catch (error) {
567
+ console.error("\u83B7\u53D6\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
568
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
569
+ }
570
+ };
571
+ }
572
+ function createUpdateEventHandler(config) {
573
+ initDbService(config.db);
574
+ return async (request, { params }) => {
575
+ try {
576
+ const user2 = await config.validateAuth(request);
577
+ if (!user2) {
578
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
579
+ }
580
+ const eventId = parseInt(params.id);
581
+ if (isNaN(eventId)) {
582
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
583
+ }
584
+ const existingEvent = await calendarDbService.getEventById(eventId);
585
+ if (!existingEvent || existingEvent.userId !== user2.id) {
586
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u4FEE\u6539" }, { status: 404 });
587
+ }
588
+ const body = await request.json();
589
+ const updateData = {};
590
+ if (body.title !== void 0) updateData.title = body.title.trim();
591
+ if (body.description !== void 0) updateData.description = body.description;
592
+ if (body.startTime !== void 0) updateData.startTime = new Date(body.startTime);
593
+ if (body.endTime !== void 0) updateData.endTime = new Date(body.endTime);
594
+ if (body.allDay !== void 0) updateData.allDay = Boolean(body.allDay);
595
+ if (body.location !== void 0) updateData.location = body.location;
596
+ if (body.color !== void 0) updateData.color = body.color;
597
+ const updatedEvent = await calendarDbService.updateEvent(eventId, updateData);
598
+ if (body.recurrence !== void 0) {
599
+ await calendarDbService.deleteRecurrenceRule(eventId);
600
+ if (body.recurrence) {
601
+ await calendarDbService.createRecurrenceRule({
602
+ eventId,
603
+ ...body.recurrence,
604
+ endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
605
+ });
606
+ }
607
+ }
608
+ if (body.reminders !== void 0) {
609
+ await calendarDbService.deleteEventReminders(eventId);
610
+ if (Array.isArray(body.reminders)) {
611
+ for (const reminder of body.reminders) {
612
+ if (reminder.reminderTime) {
613
+ await calendarDbService.createReminder({
614
+ eventId,
615
+ reminderTime: new Date(reminder.reminderTime),
616
+ reminderType: reminder.reminderType || "notification",
617
+ status: "pending"
618
+ });
619
+ }
620
+ }
621
+ }
622
+ }
623
+ return server.NextResponse.json({
624
+ success: true,
625
+ data: updatedEvent,
626
+ message: "\u66F4\u65B0\u4E8B\u4EF6\u6210\u529F"
627
+ });
628
+ } catch (error) {
629
+ console.error("\u66F4\u65B0\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
630
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
631
+ }
632
+ };
633
+ }
634
+ function createDeleteEventHandler(config) {
635
+ initDbService(config.db);
636
+ return async (request, { params }) => {
637
+ try {
638
+ const user2 = await config.validateAuth(request);
639
+ if (!user2) {
640
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
641
+ }
642
+ const eventId = parseInt(params.id);
643
+ if (isNaN(eventId)) {
644
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
645
+ }
646
+ const existingEvent = await calendarDbService.getEventById(eventId);
647
+ if (!existingEvent || existingEvent.userId !== user2.id) {
648
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u5220\u9664" }, { status: 404 });
649
+ }
650
+ await calendarDbService.deleteEvent(eventId);
651
+ return server.NextResponse.json({
652
+ success: true,
653
+ message: "\u5220\u9664\u4E8B\u4EF6\u6210\u529F"
654
+ });
655
+ } catch (error) {
656
+ console.error("\u5220\u9664\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
657
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
658
+ }
659
+ };
660
+ }
661
+ function createBatchDeleteEventsHandler(config) {
662
+ initDbService(config.db);
663
+ return async (request) => {
664
+ try {
665
+ const user2 = await config.validateAuth(request);
666
+ if (!user2) {
667
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
668
+ }
669
+ const body = await request.json();
670
+ if (!body.eventIds || !Array.isArray(body.eventIds)) {
671
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
672
+ }
673
+ const results = await Promise.all(
674
+ body.eventIds.map(async (id) => {
675
+ const event = await calendarDbService.getEventById(id);
676
+ if (event && event.userId === user2.id) {
677
+ await calendarDbService.deleteEvent(id);
678
+ return true;
679
+ }
680
+ return false;
681
+ })
682
+ );
683
+ const deletedCount = results.filter(Boolean).length;
684
+ return server.NextResponse.json({
685
+ success: true,
686
+ data: { deletedCount },
687
+ message: "\u6210\u529F\u5220\u9664 " + deletedCount + " \u4E2A\u4E8B\u4EF6"
688
+ });
689
+ } catch (error) {
690
+ console.error("\u6279\u91CF\u5220\u9664\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
691
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
692
+ }
693
+ };
694
+ }
695
+ function createConfigHandler(config) {
696
+ initDbService(config.db);
697
+ return {
698
+ GET: async (request) => {
699
+ try {
700
+ const user2 = await config.validateAuth(request);
701
+ if (!user2) {
702
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
703
+ }
704
+ const dbConfig = await calendarDbService.getUserConfig(user2.id);
705
+ return server.NextResponse.json({
706
+ success: true,
707
+ data: dbConfig || {
708
+ firstDayOfWeek: 1,
709
+ workingHoursStart: "09:00",
710
+ workingHoursEnd: "18:00",
711
+ timeZone: "Asia/Shanghai",
712
+ dateFormat: "YYYY-MM-DD",
713
+ timeFormat: "HH:mm",
714
+ defaultView: "month",
715
+ defaultEventColor: "#3B82F6",
716
+ weekends: true,
717
+ eventColors: {}
718
+ },
719
+ message: "\u83B7\u53D6\u914D\u7F6E\u6210\u529F"
720
+ });
721
+ } catch (error) {
722
+ console.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25\uFF1A", error);
723
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
724
+ }
725
+ },
726
+ PUT: async (request) => {
727
+ try {
728
+ const user2 = await config.validateAuth(request);
729
+ if (!user2) {
730
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
731
+ }
732
+ const body = await request.json();
733
+ const updatedConfig = await calendarDbService.upsertUserConfig(user2.id, body);
734
+ return server.NextResponse.json({
735
+ success: true,
736
+ data: updatedConfig,
737
+ message: "\u66F4\u65B0\u914D\u7F6E\u6210\u529F"
738
+ });
739
+ } catch (error) {
740
+ console.error("\u66F4\u65B0\u914D\u7F6E\u5931\u8D25\uFF1A", error);
741
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
742
+ }
743
+ }
744
+ };
745
+ }
746
+
747
+ exports.createBatchDeleteEventsHandler = createBatchDeleteEventsHandler;
748
+ exports.createConfigHandler = createConfigHandler;
749
+ exports.createCreateEventHandler = createCreateEventHandler;
750
+ exports.createDeleteEventHandler = createDeleteEventHandler;
751
+ exports.createGetEventByIdHandler = createGetEventByIdHandler;
752
+ exports.createGetEventsHandler = createGetEventsHandler;
753
+ exports.createUpdateEventHandler = createUpdateEventHandler;
754
+ //# sourceMappingURL=index.js.map
755
+ //# sourceMappingURL=index.js.map