sa2kit 1.6.59 → 1.6.62
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.
- package/dist/UniversalFileService-C3WQAFOV.js +15 -0
- package/dist/{UniversalFileService-J6ET6KZK.js.map → UniversalFileService-C3WQAFOV.js.map} +1 -1
- package/dist/UniversalFileService-O3IEROBN.mjs +6 -0
- package/dist/{UniversalFileService-336GFY6N.mjs.map → UniversalFileService-O3IEROBN.mjs.map} +1 -1
- package/dist/ai/llm/index.d.mts +70 -0
- package/dist/ai/llm/index.d.ts +70 -0
- package/dist/ai/llm/index.js +54 -0
- package/dist/ai/llm/index.js.map +1 -0
- package/dist/ai/llm/index.mjs +5 -0
- package/dist/ai/llm/index.mjs.map +1 -0
- package/dist/ai/llm/ui/electron/index.d.mts +5 -0
- package/dist/ai/llm/ui/electron/index.d.ts +5 -0
- package/dist/ai/llm/ui/electron/index.js +21 -0
- package/dist/ai/llm/ui/electron/index.js.map +1 -0
- package/dist/ai/llm/ui/electron/index.mjs +8 -0
- package/dist/ai/llm/ui/electron/index.mjs.map +1 -0
- package/dist/ai/llm/ui/miniapp/index.d.mts +9 -0
- package/dist/ai/llm/ui/miniapp/index.d.ts +9 -0
- package/dist/ai/llm/ui/miniapp/index.js +107 -0
- package/dist/ai/llm/ui/miniapp/index.js.map +1 -0
- package/dist/ai/llm/ui/miniapp/index.mjs +101 -0
- package/dist/ai/llm/ui/miniapp/index.mjs.map +1 -0
- package/dist/ai/llm/ui/rn/index.d.mts +9 -0
- package/dist/ai/llm/ui/rn/index.d.ts +9 -0
- package/dist/ai/llm/ui/rn/index.js +249 -0
- package/dist/ai/llm/ui/rn/index.js.map +1 -0
- package/dist/ai/llm/ui/rn/index.mjs +243 -0
- package/dist/ai/llm/ui/rn/index.mjs.map +1 -0
- package/dist/ai/llm/ui/web/index.d.mts +15 -0
- package/dist/ai/llm/ui/web/index.d.ts +15 -0
- package/dist/ai/llm/ui/web/index.js +21 -0
- package/dist/ai/llm/ui/web/index.js.map +1 -0
- package/dist/ai/llm/ui/web/index.mjs +8 -0
- package/dist/ai/llm/ui/web/index.mjs.map +1 -0
- package/dist/ar/index.d.mts +7 -0
- package/dist/ar/index.d.ts +7 -0
- package/dist/ar/index.js +17 -0
- package/dist/ar/index.js.map +1 -0
- package/dist/ar/index.mjs +4 -0
- package/dist/ar/index.mjs.map +1 -0
- package/dist/auth/index.js +22 -22
- package/dist/auth/index.mjs +2 -2
- package/dist/auth/legacy/db/index.d.mts +5 -0
- package/dist/auth/legacy/db/index.d.ts +5 -0
- package/dist/auth/legacy/db/index.js +34 -0
- package/dist/auth/legacy/db/index.js.map +1 -0
- package/dist/auth/legacy/db/index.mjs +5 -0
- package/dist/auth/legacy/db/index.mjs.map +1 -0
- package/dist/auth/legacy/index.d.mts +51 -0
- package/dist/auth/legacy/index.d.ts +51 -0
- package/dist/auth/legacy/index.js +146 -0
- package/dist/auth/legacy/index.js.map +1 -0
- package/dist/auth/legacy/index.mjs +13 -0
- package/dist/auth/legacy/index.mjs.map +1 -0
- package/dist/auth/legacy/logic/index.d.mts +9 -0
- package/dist/auth/legacy/logic/index.d.ts +9 -0
- package/dist/auth/legacy/logic/index.js +18 -0
- package/dist/auth/legacy/logic/index.js.map +1 -0
- package/dist/auth/legacy/logic/index.mjs +5 -0
- package/dist/auth/legacy/logic/index.mjs.map +1 -0
- package/dist/auth/legacy/routes/index.d.mts +50 -0
- package/dist/auth/legacy/routes/index.d.ts +50 -0
- package/dist/auth/legacy/routes/index.js +34 -0
- package/dist/auth/legacy/routes/index.js.map +1 -0
- package/dist/auth/legacy/routes/index.mjs +5 -0
- package/dist/auth/legacy/routes/index.mjs.map +1 -0
- package/dist/auth/legacy/schema/index.d.mts +401 -0
- package/dist/auth/legacy/schema/index.d.ts +401 -0
- package/dist/auth/legacy/schema/index.js +29 -0
- package/dist/auth/legacy/schema/index.js.map +1 -0
- package/dist/auth/legacy/schema/index.mjs +4 -0
- package/dist/auth/legacy/schema/index.mjs.map +1 -0
- package/dist/auth/legacy/server/index.d.mts +15 -0
- package/dist/auth/legacy/server/index.d.ts +15 -0
- package/dist/auth/legacy/server/index.js +65 -0
- package/dist/auth/legacy/server/index.js.map +1 -0
- package/dist/auth/legacy/server/index.mjs +8 -0
- package/dist/auth/legacy/server/index.mjs.map +1 -0
- package/dist/auth/legacy/services/index.d.mts +40 -0
- package/dist/auth/legacy/services/index.d.ts +40 -0
- package/dist/auth/legacy/services/index.js +14 -0
- package/dist/auth/legacy/services/index.js.map +1 -0
- package/dist/auth/legacy/services/index.mjs +5 -0
- package/dist/auth/legacy/services/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.d.mts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.d.ts +10 -0
- package/dist/auth/legacy/ui/miniapp/index.js +23 -0
- package/dist/auth/legacy/ui/miniapp/index.js.map +1 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs +6 -0
- package/dist/auth/legacy/ui/miniapp/index.mjs.map +1 -0
- package/dist/auth/legacy/ui/web/index.d.mts +22 -0
- package/dist/auth/legacy/ui/web/index.d.ts +22 -0
- package/dist/auth/legacy/ui/web/index.js +31 -0
- package/dist/auth/legacy/ui/web/index.js.map +1 -0
- package/dist/auth/legacy/ui/web/index.mjs +6 -0
- package/dist/auth/legacy/ui/web/index.mjs.map +1 -0
- package/dist/booking-B0BM8grt.d.mts +141 -0
- package/dist/booking-CUy8u7Za.d.ts +141 -0
- package/dist/{bookingAdminService-Dmg7dC6V.d.mts → bookingAdminService-BNEDyw7U.d.mts} +1 -1
- package/dist/{bookingAdminService-B2QDjSHJ.d.ts → bookingAdminService-BtOtG96L.d.ts} +1 -1
- package/dist/calendar/index.d.mts +390 -237
- package/dist/calendar/index.d.ts +390 -237
- package/dist/calendar/index.js +3825 -3785
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +3730 -3696
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/routes/index.js +30 -327
- package/dist/calendar/routes/index.js.map +1 -1
- package/dist/calendar/routes/index.mjs +1 -323
- package/dist/calendar/routes/index.mjs.map +1 -1
- package/dist/calendar/server.d.mts +6 -0
- package/dist/calendar/server.d.ts +6 -0
- package/dist/calendar/server.js +41 -13
- package/dist/calendar/server.js.map +1 -1
- package/dist/calendar/server.mjs +2 -2
- package/dist/calendar/server.mjs.map +1 -1
- package/dist/{cart-D3o67Q3H.d.ts → cart-Cw3i0Dy6.d.ts} +1 -1
- package/dist/{cart-CcZ7rQyG.d.mts → cart-DLSbsihH.d.mts} +1 -1
- package/dist/chunk-24F7KUED.js +263 -0
- package/dist/chunk-24F7KUED.js.map +1 -0
- package/dist/{chunk-YMS6BPXS.js → chunk-27IUMDDK.js} +3 -3
- package/dist/{chunk-YMS6BPXS.js.map → chunk-27IUMDDK.js.map} +1 -1
- package/dist/chunk-37M6NZIF.js +279 -0
- package/dist/chunk-37M6NZIF.js.map +1 -0
- package/dist/chunk-3JMUNOUT.js +144 -0
- package/dist/chunk-3JMUNOUT.js.map +1 -0
- package/dist/chunk-3PFCOTJP.mjs +256 -0
- package/dist/chunk-3PFCOTJP.mjs.map +1 -0
- package/dist/{chunk-SKCMZYSQ.js → chunk-3YSRTVIY.js} +31 -15
- package/dist/chunk-3YSRTVIY.js.map +1 -0
- package/dist/{chunk-NZZZUMMX.mjs → chunk-57MVE5LL.mjs} +3 -3
- package/dist/{chunk-NZZZUMMX.mjs.map → chunk-57MVE5LL.mjs.map} +1 -1
- package/dist/{chunk-622Y6LTH.mjs → chunk-5BLZEVWK.mjs} +196 -468
- package/dist/chunk-5BLZEVWK.mjs.map +1 -0
- package/dist/{chunk-UVHPCLP6.js → chunk-5LCGOCKG.js} +5 -5
- package/dist/{chunk-UVHPCLP6.js.map → chunk-5LCGOCKG.js.map} +1 -1
- package/dist/chunk-6XUQ2B4K.js +219 -0
- package/dist/chunk-6XUQ2B4K.js.map +1 -0
- package/dist/{chunk-NCOXT7SK.js → chunk-77UEPWVQ.js} +4 -4
- package/dist/{chunk-NCOXT7SK.js.map → chunk-77UEPWVQ.js.map} +1 -1
- package/dist/chunk-C76U5FF4.mjs +10 -0
- package/dist/chunk-C76U5FF4.mjs.map +1 -0
- package/dist/chunk-CFM56MGO.mjs +35 -0
- package/dist/chunk-CFM56MGO.mjs.map +1 -0
- package/dist/{chunk-LJGJPAQ4.js → chunk-COOI6MT3.js} +2 -11
- package/dist/chunk-COOI6MT3.js.map +1 -0
- package/dist/chunk-CPSFYP34.mjs +140 -0
- package/dist/chunk-CPSFYP34.mjs.map +1 -0
- package/dist/chunk-D22QBOCM.mjs +336 -0
- package/dist/chunk-D22QBOCM.mjs.map +1 -0
- package/dist/chunk-DA4QV64P.mjs +35 -0
- package/dist/chunk-DA4QV64P.mjs.map +1 -0
- package/dist/{chunk-FVDPGX6A.mjs → chunk-DWJLOHAE.mjs} +2 -11
- package/dist/chunk-DWJLOHAE.mjs.map +1 -0
- package/dist/chunk-EKDLZND6.js +275 -0
- package/dist/chunk-EKDLZND6.js.map +1 -0
- package/dist/chunk-EKQPFZXQ.js +12 -0
- package/dist/chunk-EKQPFZXQ.js.map +1 -0
- package/dist/chunk-ERAAB5VG.js +324 -0
- package/dist/chunk-ERAAB5VG.js.map +1 -0
- package/dist/chunk-ESLY72VI.mjs +175 -0
- package/dist/chunk-ESLY72VI.mjs.map +1 -0
- package/dist/chunk-FGQGWW73.js +38 -0
- package/dist/chunk-FGQGWW73.js.map +1 -0
- package/dist/chunk-FXQOXLDE.js +120 -0
- package/dist/chunk-FXQOXLDE.js.map +1 -0
- package/dist/chunk-FZELCJR7.mjs +19 -0
- package/dist/chunk-FZELCJR7.mjs.map +1 -0
- package/dist/{chunk-HHVDOIPV.js → chunk-H3P2PGZL.js} +3 -3
- package/dist/{chunk-HHVDOIPV.js.map → chunk-H3P2PGZL.js.map} +1 -1
- package/dist/chunk-HBQMN5QM.mjs +10 -0
- package/dist/chunk-HBQMN5QM.mjs.map +1 -0
- package/dist/chunk-ITRIXMXF.mjs +862 -0
- package/dist/chunk-ITRIXMXF.mjs.map +1 -0
- package/dist/chunk-IUWSCUDC.js +4 -0
- package/dist/chunk-IUWSCUDC.js.map +1 -0
- package/dist/chunk-JCKCKRC2.js +50 -0
- package/dist/chunk-JCKCKRC2.js.map +1 -0
- package/dist/chunk-L7GQNY54.mjs +286 -0
- package/dist/chunk-L7GQNY54.mjs.map +1 -0
- package/dist/{chunk-ZRWED7Q6.js → chunk-LDVJ7URJ.js} +235 -520
- package/dist/chunk-LDVJ7URJ.js.map +1 -0
- package/dist/{chunk-WK3HTUID.js → chunk-MLP74E3O.js} +609 -1643
- package/dist/chunk-MLP74E3O.js.map +1 -0
- package/dist/chunk-NAX4TUT7.js +182 -0
- package/dist/chunk-NAX4TUT7.js.map +1 -0
- package/dist/chunk-NW4EN4YI.mjs +213 -0
- package/dist/chunk-NW4EN4YI.mjs.map +1 -0
- package/dist/{chunk-7CMGQX3S.mjs → chunk-OX6VMQDU.mjs} +14 -13
- package/dist/chunk-OX6VMQDU.mjs.map +1 -0
- package/dist/chunk-P3QMT3AY.mjs +44 -0
- package/dist/chunk-P3QMT3AY.mjs.map +1 -0
- package/dist/chunk-PJ4KYAQZ.mjs +631 -0
- package/dist/chunk-PJ4KYAQZ.mjs.map +1 -0
- package/dist/chunk-PLSEAREM.js +345 -0
- package/dist/chunk-PLSEAREM.js.map +1 -0
- package/dist/{chunk-EGJPS7OL.mjs → chunk-QZU4UJZG.mjs} +3 -3
- package/dist/{chunk-EGJPS7OL.mjs.map → chunk-QZU4UJZG.mjs.map} +1 -1
- package/dist/chunk-RJVR33ME.mjs +3 -0
- package/dist/chunk-RJVR33ME.mjs.map +1 -0
- package/dist/chunk-SYBHDB2D.js +650 -0
- package/dist/chunk-SYBHDB2D.js.map +1 -0
- package/dist/chunk-TVKVM7JT.js +21 -0
- package/dist/chunk-TVKVM7JT.js.map +1 -0
- package/dist/{chunk-UZB4IO3T.mjs → chunk-UTB72ZJ7.mjs} +415 -1449
- package/dist/chunk-UTB72ZJ7.mjs.map +1 -0
- package/dist/chunk-V5HE6IYN.js +12 -0
- package/dist/chunk-V5HE6IYN.js.map +1 -0
- package/dist/chunk-V7EVKD5G.mjs +116 -0
- package/dist/chunk-V7EVKD5G.mjs.map +1 -0
- package/dist/chunk-VGPR3KLR.js +872 -0
- package/dist/chunk-VGPR3KLR.js.map +1 -0
- package/dist/chunk-VS7WATQD.js +255 -0
- package/dist/chunk-VS7WATQD.js.map +1 -0
- package/dist/chunk-VSP7XJT5.mjs +272 -0
- package/dist/chunk-VSP7XJT5.mjs.map +1 -0
- package/dist/{chunk-SNBILYSH.mjs → chunk-VTKAIOP5.mjs} +5 -5
- package/dist/{chunk-SNBILYSH.mjs.map → chunk-VTKAIOP5.mjs.map} +1 -1
- package/dist/chunk-VULJUXTF.mjs +267 -0
- package/dist/chunk-VULJUXTF.mjs.map +1 -0
- package/dist/chunk-XAHM6B3V.js +44 -0
- package/dist/chunk-XAHM6B3V.js.map +1 -0
- package/dist/chunk-YSF5YISM.mjs +248 -0
- package/dist/chunk-YSF5YISM.mjs.map +1 -0
- package/dist/{chunk-OFYBMMWT.mjs → chunk-YYJEVAJI.mjs} +3 -3
- package/dist/{chunk-OFYBMMWT.mjs.map → chunk-YYJEVAJI.mjs.map} +1 -1
- package/dist/components/index.d.mts +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +182 -181
- package/dist/components/index.mjs +4 -3
- package/dist/{booking-BXtkG2ns.d.mts → index-Bi666jIm.d.mts} +1 -139
- package/dist/{booking-BXtkG2ns.d.ts → index-Bi666jIm.d.ts} +1 -139
- package/dist/index-DNKZ7-R_.d.mts +184 -0
- package/dist/index-DNKZ7-R_.d.ts +184 -0
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +285 -229
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +15 -10
- package/dist/index.mjs.map +1 -1
- package/dist/mikuFusionGame/index.js +3 -3
- package/dist/mikuFusionGame/index.mjs +2 -2
- package/dist/mmd/index.d.mts +67 -9
- package/dist/mmd/index.d.ts +67 -9
- package/dist/mmd/index.js +969 -625
- package/dist/mmd/index.js.map +1 -1
- package/dist/mmd/index.mjs +969 -628
- package/dist/mmd/index.mjs.map +1 -1
- package/dist/portfolio/index.js +10 -9
- package/dist/portfolio/index.mjs +5 -4
- package/dist/qqbot/index.d.mts +2 -0
- package/dist/qqbot/index.d.ts +2 -0
- package/dist/qqbot/index.js +21 -0
- package/dist/qqbot/index.js.map +1 -0
- package/dist/qqbot/index.mjs +4 -0
- package/dist/qqbot/index.mjs.map +1 -0
- package/dist/qqbot/server/index.d.mts +91 -0
- package/dist/qqbot/server/index.d.ts +91 -0
- package/dist/qqbot/server/index.js +21 -0
- package/dist/qqbot/server/index.js.map +1 -0
- package/dist/qqbot/server/index.mjs +4 -0
- package/dist/qqbot/server/index.mjs.map +1 -0
- package/dist/qqbot/ui/web/index.d.mts +10 -0
- package/dist/qqbot/ui/web/index.d.ts +10 -0
- package/dist/qqbot/ui/web/index.js +105 -0
- package/dist/qqbot/ui/web/index.js.map +1 -0
- package/dist/qqbot/ui/web/index.mjs +99 -0
- package/dist/qqbot/ui/web/index.mjs.map +1 -0
- package/dist/screenReceiver/index.d.mts +78 -0
- package/dist/screenReceiver/index.d.ts +78 -0
- package/dist/screenReceiver/index.js +17 -0
- package/dist/screenReceiver/index.js.map +1 -0
- package/dist/screenReceiver/index.mjs +4 -0
- package/dist/screenReceiver/index.mjs.map +1 -0
- package/dist/screenReceiver/server/index.d.mts +36 -0
- package/dist/screenReceiver/server/index.d.ts +36 -0
- package/dist/screenReceiver/server/index.js +160 -0
- package/dist/screenReceiver/server/index.js.map +1 -0
- package/dist/screenReceiver/server/index.mjs +157 -0
- package/dist/screenReceiver/server/index.mjs.map +1 -0
- package/dist/showmasterpiece/db/index.js +42 -42
- package/dist/showmasterpiece/db/index.mjs +1 -1
- package/dist/showmasterpiece/index.d.mts +8 -6
- package/dist/showmasterpiece/index.d.ts +8 -6
- package/dist/showmasterpiece/index.js +142 -130
- package/dist/showmasterpiece/index.js.map +1 -1
- package/dist/showmasterpiece/index.mjs +18 -6
- package/dist/showmasterpiece/index.mjs.map +1 -1
- package/dist/showmasterpiece/logic/index.d.mts +9 -17
- package/dist/showmasterpiece/logic/index.d.ts +9 -17
- package/dist/showmasterpiece/logic/index.js +35 -34
- package/dist/showmasterpiece/logic/index.mjs +3 -2
- package/dist/showmasterpiece/logic/miniapp/index.d.mts +15 -0
- package/dist/showmasterpiece/logic/miniapp/index.d.ts +15 -0
- package/dist/showmasterpiece/logic/miniapp/index.js +42 -0
- package/dist/showmasterpiece/logic/miniapp/index.js.map +1 -0
- package/dist/showmasterpiece/logic/miniapp/index.mjs +5 -0
- package/dist/showmasterpiece/logic/miniapp/index.mjs.map +1 -0
- package/dist/showmasterpiece/server/index.js +42 -42
- package/dist/showmasterpiece/server/index.mjs +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.d.mts +5 -2
- package/dist/showmasterpiece/ui/miniapp/index.d.ts +5 -2
- package/dist/showmasterpiece/ui/miniapp/index.js +83 -55
- package/dist/showmasterpiece/ui/miniapp/index.js.map +1 -1
- package/dist/showmasterpiece/ui/miniapp/index.mjs +83 -55
- package/dist/showmasterpiece/ui/miniapp/index.mjs.map +1 -1
- package/dist/showmasterpiece/ui/web/index.d.mts +3 -2
- package/dist/showmasterpiece/ui/web/index.d.ts +3 -2
- package/dist/showmasterpiece/ui/web/index.js +44 -33
- package/dist/showmasterpiece/ui/web/index.mjs +16 -5
- package/dist/testYourself/index.js +13 -13
- package/dist/testYourself/index.mjs +2 -2
- package/dist/types-B-hOccQw.d.mts +122 -0
- package/dist/types-B8rGXc4e.d.mts +38 -0
- package/dist/types-Cg89HGz2.d.ts +38 -0
- package/dist/types-CvKvpyN8.d.mts +48 -0
- package/dist/types-CvKvpyN8.d.ts +48 -0
- package/dist/types-Dy6x2gJW.d.ts +122 -0
- package/dist/universalFile/server/index.js +11 -11
- package/dist/universalFile/server/index.mjs +4 -4
- package/package.json +106 -1
- package/dist/UniversalFileService-336GFY6N.mjs +0 -6
- package/dist/UniversalFileService-J6ET6KZK.js +0 -15
- package/dist/chunk-622Y6LTH.mjs.map +0 -1
- package/dist/chunk-7CMGQX3S.mjs.map +0 -1
- package/dist/chunk-FVDPGX6A.mjs.map +0 -1
- package/dist/chunk-GVVS4IMM.mjs +0 -302
- package/dist/chunk-GVVS4IMM.mjs.map +0 -1
- package/dist/chunk-LJGJPAQ4.js.map +0 -1
- package/dist/chunk-SKCMZYSQ.js.map +0 -1
- package/dist/chunk-UZB4IO3T.mjs.map +0 -1
- package/dist/chunk-WC5QFO3T.js +0 -314
- package/dist/chunk-WC5QFO3T.js.map +0 -1
- package/dist/chunk-WK3HTUID.js.map +0 -1
- package/dist/chunk-ZRWED7Q6.js.map +0 -1
package/dist/chunk-WC5QFO3T.js
DELETED
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkSVWQN2LR_js = require('./chunk-SVWQN2LR.js');
|
|
4
|
-
var pgCore = require('drizzle-orm/pg-core');
|
|
5
|
-
var drizzleOrm = require('drizzle-orm');
|
|
6
|
-
|
|
7
|
-
var calendarEvents = pgCore.pgTable("calendar_events", {
|
|
8
|
-
id: pgCore.serial("id").primaryKey(),
|
|
9
|
-
title: pgCore.varchar("title", { length: 255 }).notNull(),
|
|
10
|
-
description: pgCore.text("description"),
|
|
11
|
-
startTime: pgCore.timestamp("start_time").notNull(),
|
|
12
|
-
endTime: pgCore.timestamp("end_time").notNull(),
|
|
13
|
-
allDay: pgCore.boolean("all_day").notNull().default(false),
|
|
14
|
-
location: pgCore.varchar("location", { length: 500 }),
|
|
15
|
-
color: pgCore.varchar("color", { length: 7 }).notNull().default("#3B82F6"),
|
|
16
|
-
// 十六进制颜色值
|
|
17
|
-
priority: pgCore.varchar("priority", { length: 10 }).notNull().default("normal"),
|
|
18
|
-
// low, normal, high, urgent
|
|
19
|
-
userId: pgCore.integer("user_id").notNull().references(() => chunkSVWQN2LR_js.user.id, { onDelete: "cascade" }),
|
|
20
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
21
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
22
|
-
});
|
|
23
|
-
var recurrenceRules = pgCore.pgTable("recurrence_rules", {
|
|
24
|
-
id: pgCore.serial("id").primaryKey(),
|
|
25
|
-
eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
|
|
26
|
-
ruleType: pgCore.varchar("rule_type", { length: 20 }).notNull(),
|
|
27
|
-
// daily, weekly, monthly, yearly, custom
|
|
28
|
-
interval: pgCore.integer("interval").notNull().default(1),
|
|
29
|
-
// 间隔
|
|
30
|
-
endDate: pgCore.timestamp("end_date"),
|
|
31
|
-
// 结束日期
|
|
32
|
-
count: pgCore.integer("count"),
|
|
33
|
-
// 重复次数
|
|
34
|
-
byWeekday: pgCore.json("by_weekday").$type(),
|
|
35
|
-
// 周几重复 [0,1,2,3,4,5,6],0=周日
|
|
36
|
-
byMonthday: pgCore.json("by_monthday").$type(),
|
|
37
|
-
// 月中的第几天 [1,2,...,31]
|
|
38
|
-
byMonth: pgCore.json("by_month").$type(),
|
|
39
|
-
// 第几月 [1,2,...,12]
|
|
40
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
|
|
41
|
-
});
|
|
42
|
-
var reminders = pgCore.pgTable("reminders", {
|
|
43
|
-
id: pgCore.serial("id").primaryKey(),
|
|
44
|
-
eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
|
|
45
|
-
reminderTime: pgCore.timestamp("reminder_time").notNull(),
|
|
46
|
-
// 提醒时间
|
|
47
|
-
reminderType: pgCore.varchar("reminder_type", { length: 20 }).notNull(),
|
|
48
|
-
// notification, email, sms
|
|
49
|
-
status: pgCore.varchar("status", { length: 20 }).notNull().default("pending"),
|
|
50
|
-
// pending, sent, failed
|
|
51
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
52
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
53
|
-
});
|
|
54
|
-
var calendarConfigs = pgCore.pgTable("calendar_configs", {
|
|
55
|
-
id: pgCore.serial("id").primaryKey(),
|
|
56
|
-
userId: pgCore.integer("user_id").notNull().references(() => chunkSVWQN2LR_js.user.id, { onDelete: "cascade" }).unique(),
|
|
57
|
-
firstDayOfWeek: pgCore.integer("first_day_of_week").notNull().default(1),
|
|
58
|
-
// 0=周日, 1=周一
|
|
59
|
-
workingHoursStart: pgCore.varchar("working_hours_start", { length: 5 }).notNull().default("09:00"),
|
|
60
|
-
workingHoursEnd: pgCore.varchar("working_hours_end", { length: 5 }).notNull().default("18:00"),
|
|
61
|
-
timeZone: pgCore.varchar("time_zone", { length: 50 }).notNull().default("Asia/Shanghai"),
|
|
62
|
-
dateFormat: pgCore.varchar("date_format", { length: 20 }).notNull().default("YYYY-MM-DD"),
|
|
63
|
-
timeFormat: pgCore.varchar("time_format", { length: 20 }).notNull().default("HH:mm"),
|
|
64
|
-
defaultView: pgCore.varchar("default_view", { length: 20 }).notNull().default("month"),
|
|
65
|
-
// month, week, day, agenda
|
|
66
|
-
defaultEventColor: pgCore.varchar("default_event_color", { length: 7 }).notNull().default("#3B82F6"),
|
|
67
|
-
weekends: pgCore.boolean("weekends").notNull().default(true),
|
|
68
|
-
eventColors: pgCore.json("event_colors").$type().default({
|
|
69
|
-
blue: "#3B82F6",
|
|
70
|
-
green: "#10B981",
|
|
71
|
-
purple: "#8B5CF6",
|
|
72
|
-
red: "#EF4444",
|
|
73
|
-
yellow: "#F59E0B",
|
|
74
|
-
pink: "#EC4899",
|
|
75
|
-
indigo: "#6366F1",
|
|
76
|
-
gray: "#6B7280"
|
|
77
|
-
}),
|
|
78
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
79
|
-
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
80
|
-
});
|
|
81
|
-
var eventShares = pgCore.pgTable("event_shares", {
|
|
82
|
-
id: pgCore.serial("id").primaryKey(),
|
|
83
|
-
eventId: pgCore.integer("event_id").notNull().references(() => calendarEvents.id, { onDelete: "cascade" }),
|
|
84
|
-
sharedWithUserId: pgCore.integer("shared_with_user_id").notNull().references(() => chunkSVWQN2LR_js.user.id, { onDelete: "cascade" }),
|
|
85
|
-
sharedByUserId: pgCore.integer("shared_by_user_id").notNull().references(() => chunkSVWQN2LR_js.user.id, { onDelete: "cascade" }),
|
|
86
|
-
permission: pgCore.varchar("permission", { length: 20 }).notNull().default("read"),
|
|
87
|
-
// read, write
|
|
88
|
-
createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
|
|
89
|
-
});
|
|
90
|
-
var calendarEventsRelations = drizzleOrm.relations(calendarEvents, ({ one, many }) => ({
|
|
91
|
-
user: one(chunkSVWQN2LR_js.user, {
|
|
92
|
-
fields: [calendarEvents.userId],
|
|
93
|
-
references: [chunkSVWQN2LR_js.user.id]
|
|
94
|
-
}),
|
|
95
|
-
recurrenceRule: one(recurrenceRules, {
|
|
96
|
-
fields: [calendarEvents.id],
|
|
97
|
-
references: [recurrenceRules.eventId]
|
|
98
|
-
}),
|
|
99
|
-
reminders: many(reminders),
|
|
100
|
-
shares: many(eventShares)
|
|
101
|
-
}));
|
|
102
|
-
var recurrenceRulesRelations = drizzleOrm.relations(recurrenceRules, ({ one }) => ({
|
|
103
|
-
event: one(calendarEvents, {
|
|
104
|
-
fields: [recurrenceRules.eventId],
|
|
105
|
-
references: [calendarEvents.id]
|
|
106
|
-
})
|
|
107
|
-
}));
|
|
108
|
-
var remindersRelations = drizzleOrm.relations(reminders, ({ one }) => ({
|
|
109
|
-
event: one(calendarEvents, {
|
|
110
|
-
fields: [reminders.eventId],
|
|
111
|
-
references: [calendarEvents.id]
|
|
112
|
-
})
|
|
113
|
-
}));
|
|
114
|
-
var calendarConfigsRelations = drizzleOrm.relations(calendarConfigs, ({ one }) => ({
|
|
115
|
-
user: one(chunkSVWQN2LR_js.user, {
|
|
116
|
-
fields: [calendarConfigs.userId],
|
|
117
|
-
references: [chunkSVWQN2LR_js.user.id]
|
|
118
|
-
})
|
|
119
|
-
}));
|
|
120
|
-
var eventSharesRelations = drizzleOrm.relations(eventShares, ({ one }) => ({
|
|
121
|
-
event: one(calendarEvents, {
|
|
122
|
-
fields: [eventShares.eventId],
|
|
123
|
-
references: [calendarEvents.id]
|
|
124
|
-
}),
|
|
125
|
-
sharedWithUser: one(chunkSVWQN2LR_js.user, {
|
|
126
|
-
fields: [eventShares.sharedWithUserId],
|
|
127
|
-
references: [chunkSVWQN2LR_js.user.id]
|
|
128
|
-
}),
|
|
129
|
-
sharedByUser: one(chunkSVWQN2LR_js.user, {
|
|
130
|
-
fields: [eventShares.sharedByUserId],
|
|
131
|
-
references: [chunkSVWQN2LR_js.user.id]
|
|
132
|
-
})
|
|
133
|
-
}));
|
|
134
|
-
var CalendarDbService = class {
|
|
135
|
-
/**
|
|
136
|
-
* 设置数据库实例
|
|
137
|
-
*/
|
|
138
|
-
setDb(db) {
|
|
139
|
-
this._db = db;
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* 获取数据库实例
|
|
143
|
-
*/
|
|
144
|
-
get db() {
|
|
145
|
-
if (!this._db) {
|
|
146
|
-
throw new Error("CalendarDbService: Database instance not set. Call setDb() first.");
|
|
147
|
-
}
|
|
148
|
-
return this._db;
|
|
149
|
-
}
|
|
150
|
-
// ===== 事件基础操作 =====
|
|
151
|
-
/**
|
|
152
|
-
* 获取用户的所有事件(基础版本)
|
|
153
|
-
*/
|
|
154
|
-
async getAllEvents(userId, startDate, endDate) {
|
|
155
|
-
const conditions = [drizzleOrm.eq(calendarEvents.userId, userId)];
|
|
156
|
-
if (startDate) {
|
|
157
|
-
conditions.push(drizzleOrm.gte(calendarEvents.startTime, startDate));
|
|
158
|
-
}
|
|
159
|
-
if (endDate) {
|
|
160
|
-
conditions.push(drizzleOrm.lte(calendarEvents.endTime, endDate));
|
|
161
|
-
}
|
|
162
|
-
const events = await this.db.select().from(calendarEvents).where(drizzleOrm.and(...conditions)).orderBy(drizzleOrm.asc(calendarEvents.startTime));
|
|
163
|
-
return events;
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* 根据ID获取事件
|
|
167
|
-
*/
|
|
168
|
-
async getEventById(eventId) {
|
|
169
|
-
const [event] = await this.db.select().from(calendarEvents).where(drizzleOrm.eq(calendarEvents.id, eventId)).limit(1);
|
|
170
|
-
return event || null;
|
|
171
|
-
}
|
|
172
|
-
/**
|
|
173
|
-
* 创建事件(基础版本)
|
|
174
|
-
*/
|
|
175
|
-
async createEvent(eventData) {
|
|
176
|
-
const [newEvent] = await this.db.insert(calendarEvents).values(eventData).returning();
|
|
177
|
-
return newEvent;
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* 更新事件
|
|
181
|
-
*/
|
|
182
|
-
async updateEvent(eventId, eventData) {
|
|
183
|
-
const updateData = {
|
|
184
|
-
...eventData,
|
|
185
|
-
updatedAt: /* @__PURE__ */ new Date()
|
|
186
|
-
};
|
|
187
|
-
const [updatedEvent] = await this.db.update(calendarEvents).set(updateData).where(drizzleOrm.eq(calendarEvents.id, eventId)).returning();
|
|
188
|
-
return updatedEvent;
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* 删除事件
|
|
192
|
-
*/
|
|
193
|
-
async deleteEvent(eventId) {
|
|
194
|
-
await this.db.delete(calendarEvents).where(drizzleOrm.eq(calendarEvents.id, eventId));
|
|
195
|
-
}
|
|
196
|
-
// ===== 用户配置操作 =====
|
|
197
|
-
/**
|
|
198
|
-
* 获取用户的日历配置
|
|
199
|
-
*/
|
|
200
|
-
async getUserConfig(userId) {
|
|
201
|
-
const [config] = await this.db.select().from(calendarConfigs).where(drizzleOrm.eq(calendarConfigs.userId, userId)).limit(1);
|
|
202
|
-
return config || null;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* 创建或更新用户配置
|
|
206
|
-
*/
|
|
207
|
-
async upsertUserConfig(userId, configData) {
|
|
208
|
-
const existingConfig = await this.getUserConfig(userId);
|
|
209
|
-
if (existingConfig) {
|
|
210
|
-
const [updatedConfig] = await this.db.update(calendarConfigs).set({
|
|
211
|
-
...configData,
|
|
212
|
-
updatedAt: /* @__PURE__ */ new Date()
|
|
213
|
-
}).where(drizzleOrm.eq(calendarConfigs.userId, userId)).returning();
|
|
214
|
-
return updatedConfig;
|
|
215
|
-
} else {
|
|
216
|
-
const [newConfig] = await this.db.insert(calendarConfigs).values({
|
|
217
|
-
userId,
|
|
218
|
-
...configData
|
|
219
|
-
}).returning();
|
|
220
|
-
return newConfig;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
/**
|
|
224
|
-
* 为事件创建重复规则
|
|
225
|
-
*/
|
|
226
|
-
async createRecurrenceRule(ruleData) {
|
|
227
|
-
const [newRule] = await this.db.insert(recurrenceRules).values(ruleData).returning();
|
|
228
|
-
return newRule;
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* 获取事件的重复规则
|
|
232
|
-
*/
|
|
233
|
-
async getRecurrenceRule(eventId) {
|
|
234
|
-
const [rule] = await this.db.select().from(recurrenceRules).where(drizzleOrm.eq(recurrenceRules.eventId, eventId)).limit(1);
|
|
235
|
-
return rule || null;
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* 删除重复规则
|
|
239
|
-
*/
|
|
240
|
-
async deleteRecurrenceRule(eventId) {
|
|
241
|
-
await this.db.delete(recurrenceRules).where(drizzleOrm.eq(recurrenceRules.eventId, eventId));
|
|
242
|
-
}
|
|
243
|
-
/**
|
|
244
|
-
* 为事件创建提醒
|
|
245
|
-
*/
|
|
246
|
-
async createReminder(reminderData) {
|
|
247
|
-
const [newReminder] = await this.db.insert(reminders).values({
|
|
248
|
-
...reminderData,
|
|
249
|
-
status: reminderData.status || "pending"
|
|
250
|
-
}).returning();
|
|
251
|
-
return newReminder;
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* 获取事件的提醒列表
|
|
255
|
-
*/
|
|
256
|
-
async getEventReminders(eventId) {
|
|
257
|
-
const remindersList = await this.db.select().from(reminders).where(drizzleOrm.eq(reminders.eventId, eventId)).orderBy(drizzleOrm.asc(reminders.reminderTime));
|
|
258
|
-
return remindersList;
|
|
259
|
-
}
|
|
260
|
-
/**
|
|
261
|
-
* 删除事件的所有提醒
|
|
262
|
-
*/
|
|
263
|
-
async deleteEventReminders(eventId) {
|
|
264
|
-
await this.db.delete(reminders).where(drizzleOrm.eq(reminders.eventId, eventId));
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* 获取用户在指定时间范围内的事件数量
|
|
268
|
-
*/
|
|
269
|
-
async getEventCount(userId, startDate, endDate) {
|
|
270
|
-
const conditions = [drizzleOrm.eq(calendarEvents.userId, userId)];
|
|
271
|
-
if (startDate) {
|
|
272
|
-
conditions.push(drizzleOrm.gte(calendarEvents.startTime, startDate));
|
|
273
|
-
}
|
|
274
|
-
if (endDate) {
|
|
275
|
-
conditions.push(drizzleOrm.lte(calendarEvents.endTime, endDate));
|
|
276
|
-
}
|
|
277
|
-
const result = await this.db.select({ count: calendarEvents.id }).from(calendarEvents).where(drizzleOrm.and(...conditions));
|
|
278
|
-
return result.length;
|
|
279
|
-
}
|
|
280
|
-
/**
|
|
281
|
-
* 搜索事件
|
|
282
|
-
*/
|
|
283
|
-
async searchEvents(userId, searchTerm) {
|
|
284
|
-
const events = await this.db.select().from(calendarEvents).where(
|
|
285
|
-
drizzleOrm.and(
|
|
286
|
-
drizzleOrm.eq(calendarEvents.userId, userId)
|
|
287
|
-
)
|
|
288
|
-
).orderBy(drizzleOrm.desc(calendarEvents.startTime));
|
|
289
|
-
return events.filter(
|
|
290
|
-
(event) => event.title.toLowerCase().includes(searchTerm.toLowerCase()) || event.description && event.description.toLowerCase().includes(searchTerm.toLowerCase())
|
|
291
|
-
);
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* 批量删除用户的所有事件
|
|
295
|
-
*/
|
|
296
|
-
async deleteAllUserEvents(userId) {
|
|
297
|
-
await this.db.delete(calendarEvents).where(drizzleOrm.eq(calendarEvents.userId, userId));
|
|
298
|
-
}
|
|
299
|
-
};
|
|
300
|
-
var calendarDbService = new CalendarDbService();
|
|
301
|
-
|
|
302
|
-
exports.calendarConfigs = calendarConfigs;
|
|
303
|
-
exports.calendarConfigsRelations = calendarConfigsRelations;
|
|
304
|
-
exports.calendarDbService = calendarDbService;
|
|
305
|
-
exports.calendarEvents = calendarEvents;
|
|
306
|
-
exports.calendarEventsRelations = calendarEventsRelations;
|
|
307
|
-
exports.eventShares = eventShares;
|
|
308
|
-
exports.eventSharesRelations = eventSharesRelations;
|
|
309
|
-
exports.recurrenceRules = recurrenceRules;
|
|
310
|
-
exports.recurrenceRulesRelations = recurrenceRulesRelations;
|
|
311
|
-
exports.reminders = reminders;
|
|
312
|
-
exports.remindersRelations = remindersRelations;
|
|
313
|
-
//# sourceMappingURL=chunk-WC5QFO3T.js.map
|
|
314
|
-
//# sourceMappingURL=chunk-WC5QFO3T.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/calendar/db/schema.ts","../src/calendar/db/calendarDbService.ts"],"names":["pgTable","serial","varchar","text","timestamp","boolean","integer","user","json","relations","eq","gte","lte","and","asc","desc"],"mappings":"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","file":"chunk-WC5QFO3T.js","sourcesContent":["import { pgTable, serial, text, timestamp, boolean, varchar, integer, json } from 'drizzle-orm/pg-core';\nimport { relations } from 'drizzle-orm';\nimport { user as users } from '../../auth/schema';\n\n/**\n * 日历事件表\n */\nexport const calendarEvents = pgTable('calendar_events', {\n id: serial('id').primaryKey(),\n title: varchar('title', { length: 255 }).notNull(),\n description: text('description'),\n startTime: timestamp('start_time').notNull(),\n endTime: timestamp('end_time').notNull(),\n allDay: boolean('all_day').notNull().default(false),\n location: varchar('location', { length: 500 }),\n color: varchar('color', { length: 7 }).notNull().default('#3B82F6'), // 十六进制颜色值\n priority: varchar('priority', { length: 10 }).notNull().default('normal'), // low, normal, high, urgent\n userId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 重复规则表\n */\nexport const recurrenceRules = pgTable('recurrence_rules', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n ruleType: varchar('rule_type', { length: 20 }).notNull(), // daily, weekly, monthly, yearly, custom\n interval: integer('interval').notNull().default(1), // 间隔\n endDate: timestamp('end_date'), // 结束日期\n count: integer('count'), // 重复次数\n byWeekday: json('by_weekday').$type<number[]>(), // 周几重复 [0,1,2,3,4,5,6],0=周日\n byMonthday: json('by_monthday').$type<number[]>(), // 月中的第几天 [1,2,...,31]\n byMonth: json('by_month').$type<number[]>(), // 第几月 [1,2,...,12]\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n/**\n * 提醒表\n */\nexport const reminders = pgTable('reminders', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n reminderTime: timestamp('reminder_time').notNull(), // 提醒时间\n reminderType: varchar('reminder_type', { length: 20 }).notNull(), // notification, email, sms\n status: varchar('status', { length: 20 }).notNull().default('pending'), // pending, sent, failed\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 日历配置表 - 用户个人日历设置\n */\nexport const calendarConfigs = pgTable('calendar_configs', {\n id: serial('id').primaryKey(),\n userId: integer('user_id').notNull().references(() => users.id, { onDelete: 'cascade' }).unique(),\n firstDayOfWeek: integer('first_day_of_week').notNull().default(1), // 0=周日, 1=周一\n workingHoursStart: varchar('working_hours_start', { length: 5 }).notNull().default('09:00'),\n workingHoursEnd: varchar('working_hours_end', { length: 5 }).notNull().default('18:00'),\n timeZone: varchar('time_zone', { length: 50 }).notNull().default('Asia/Shanghai'),\n dateFormat: varchar('date_format', { length: 20 }).notNull().default('YYYY-MM-DD'),\n timeFormat: varchar('time_format', { length: 20 }).notNull().default('HH:mm'),\n defaultView: varchar('default_view', { length: 20 }).notNull().default('month'), // month, week, day, agenda\n defaultEventColor: varchar('default_event_color', { length: 7 }).notNull().default('#3B82F6'),\n weekends: boolean('weekends').notNull().default(true),\n eventColors: json('event_colors').$type<Record<string, string>>().default({\n blue: '#3B82F6',\n green: '#10B981',\n purple: '#8B5CF6',\n red: '#EF4444',\n yellow: '#F59E0B',\n pink: '#EC4899',\n indigo: '#6366F1',\n gray: '#6B7280'\n }),\n createdAt: timestamp('created_at').defaultNow().notNull(),\n updatedAt: timestamp('updated_at').defaultNow().notNull(),\n});\n\n/**\n * 事件分享表 - 用于共享日历功能\n */\nexport const eventShares = pgTable('event_shares', {\n id: serial('id').primaryKey(),\n eventId: integer('event_id').notNull().references(() => calendarEvents.id, { onDelete: 'cascade' }),\n sharedWithUserId: integer('shared_with_user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n sharedByUserId: integer('shared_by_user_id').notNull().references(() => users.id, { onDelete: 'cascade' }),\n permission: varchar('permission', { length: 20 }).notNull().default('read'), // read, write\n createdAt: timestamp('created_at').defaultNow().notNull(),\n});\n\n// ===== 关系定义 =====\n\n/**\n * 日历事件关系\n */\nexport const calendarEventsRelations = relations(calendarEvents, ({ one, many }) => ({\n user: one(users, {\n fields: [calendarEvents.userId],\n references: [users.id],\n }),\n recurrenceRule: one(recurrenceRules, {\n fields: [calendarEvents.id],\n references: [recurrenceRules.eventId],\n }),\n reminders: many(reminders),\n shares: many(eventShares),\n}));\n\n/**\n * 重复规则关系\n */\nexport const recurrenceRulesRelations = relations(recurrenceRules, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [recurrenceRules.eventId],\n references: [calendarEvents.id],\n }),\n}));\n\n/**\n * 提醒关系\n */\nexport const remindersRelations = relations(reminders, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [reminders.eventId],\n references: [calendarEvents.id],\n }),\n}));\n\n/**\n * 日历配置关系\n */\nexport const calendarConfigsRelations = relations(calendarConfigs, ({ one }) => ({\n user: one(users, {\n fields: [calendarConfigs.userId],\n references: [users.id],\n }),\n}));\n\n/**\n * 事件分享关系\n */\nexport const eventSharesRelations = relations(eventShares, ({ one }) => ({\n event: one(calendarEvents, {\n fields: [eventShares.eventId],\n references: [calendarEvents.id],\n }),\n sharedWithUser: one(users, {\n fields: [eventShares.sharedWithUserId],\n references: [users.id],\n }),\n sharedByUser: one(users, {\n fields: [eventShares.sharedByUserId],\n references: [users.id],\n }),\n}));\n\n// 所有表和关系已在上面使用 export 关键字导出 ","import { and, eq, gte, lte, desc, asc } from 'drizzle-orm';\nimport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares\n} from './schema';\n\n/**\n * 简化版日历数据库服务\n * \n * 提供基础的数据库操作,避免复杂的类型转换\n * 后续可以根据需要逐步完善\n */\nclass CalendarDbService {\n private _db: any;\n\n /**\n * 设置数据库实例\n */\n setDb(db: any) {\n this._db = db;\n }\n\n /**\n * 获取数据库实例\n */\n get db() {\n if (!this._db) {\n throw new Error('CalendarDbService: Database instance not set. Call setDb() first.');\n }\n return this._db;\n }\n \n // ===== 事件基础操作 =====\n\n /**\n * 获取用户的所有事件(基础版本)\n */\n async getAllEvents(userId: number, startDate?: Date, endDate?: Date) {\n const conditions = [eq(calendarEvents.userId, userId)];\n \n if (startDate) {\n conditions.push(gte(calendarEvents.startTime, startDate));\n }\n \n if (endDate) {\n conditions.push(lte(calendarEvents.endTime, endDate));\n }\n\n const events = await this.db\n .select()\n .from(calendarEvents)\n .where(and(...conditions))\n .orderBy(asc(calendarEvents.startTime));\n\n return events;\n }\n\n /**\n * 根据ID获取事件\n */\n async getEventById(eventId: number) {\n const [event] = await this.db\n .select()\n .from(calendarEvents)\n .where(eq(calendarEvents.id, eventId))\n .limit(1);\n\n return event || null;\n }\n\n /**\n * 创建事件(基础版本)\n */\n async createEvent(eventData: {\n title: string;\n description?: string;\n startTime: Date;\n endTime: Date;\n allDay: boolean;\n location?: string;\n color: string;\n userId: number;\n }) {\n const [newEvent] = await this.db\n .insert(calendarEvents)\n .values(eventData)\n .returning();\n\n return newEvent;\n }\n\n /**\n * 更新事件\n */\n async updateEvent(eventId: number, eventData: {\n title?: string;\n description?: string;\n startTime?: Date;\n endTime?: Date;\n allDay?: boolean;\n location?: string;\n color?: string;\n }) {\n const updateData = {\n ...eventData,\n updatedAt: new Date()\n };\n\n const [updatedEvent] = await this.db\n .update(calendarEvents)\n .set(updateData)\n .where(eq(calendarEvents.id, eventId))\n .returning();\n\n return updatedEvent;\n }\n\n /**\n * 删除事件\n */\n async deleteEvent(eventId: number): Promise<void> {\n await this.db\n .delete(calendarEvents)\n .where(eq(calendarEvents.id, eventId));\n }\n\n // ===== 用户配置操作 =====\n\n /**\n * 获取用户的日历配置\n */\n async getUserConfig(userId: number) {\n const [config] = await this.db\n .select()\n .from(calendarConfigs)\n .where(eq(calendarConfigs.userId, userId))\n .limit(1);\n\n return config || null;\n }\n\n /**\n * 创建或更新用户配置\n */\n async upsertUserConfig(userId: number, configData: {\n firstDayOfWeek?: number;\n workingHoursStart?: string;\n workingHoursEnd?: string;\n timeZone?: string;\n dateFormat?: string;\n timeFormat?: string;\n defaultView?: string;\n defaultEventColor?: string;\n weekends?: boolean;\n eventColors?: Record<string, string>;\n }) {\n const existingConfig = await this.getUserConfig(userId);\n\n if (existingConfig) {\n // 更新现有配置\n const [updatedConfig] = await this.db\n .update(calendarConfigs)\n .set({\n ...configData,\n updatedAt: new Date()\n })\n .where(eq(calendarConfigs.userId, userId))\n .returning();\n\n return updatedConfig;\n } else {\n // 创建新配置\n const [newConfig] = await this.db\n .insert(calendarConfigs)\n .values({\n userId,\n ...configData\n })\n .returning();\n\n return newConfig;\n }\n }\n\n /**\n * 为事件创建重复规则\n */\n async createRecurrenceRule(ruleData: {\n eventId: number;\n ruleType: string;\n interval: number;\n endDate?: Date;\n count?: number;\n byWeekday?: number[];\n byMonthday?: number[];\n byMonth?: number[];\n }) {\n const [newRule] = await this.db\n .insert(recurrenceRules)\n .values(ruleData)\n .returning();\n\n return newRule;\n }\n\n /**\n * 获取事件的重复规则\n */\n async getRecurrenceRule(eventId: number) {\n const [rule] = await this.db\n .select()\n .from(recurrenceRules)\n .where(eq(recurrenceRules.eventId, eventId))\n .limit(1);\n\n return rule || null;\n }\n\n /**\n * 删除重复规则\n */\n async deleteRecurrenceRule(eventId: number): Promise<void> {\n await this.db\n .delete(recurrenceRules)\n .where(eq(recurrenceRules.eventId, eventId));\n }\n\n /**\n * 为事件创建提醒\n */\n async createReminder(reminderData: {\n eventId: number;\n reminderTime: Date;\n reminderType: string;\n status?: string;\n }) {\n const [newReminder] = await this.db\n .insert(reminders)\n .values({\n ...reminderData,\n status: reminderData.status || 'pending'\n })\n .returning();\n\n return newReminder;\n }\n\n /**\n * 获取事件的提醒列表\n */\n async getEventReminders(eventId: number) {\n const remindersList = await this.db\n .select()\n .from(reminders)\n .where(eq(reminders.eventId, eventId))\n .orderBy(asc(reminders.reminderTime));\n\n return remindersList;\n }\n\n /**\n * 删除事件的所有提醒\n */\n async deleteEventReminders(eventId: number): Promise<void> {\n await this.db\n .delete(reminders)\n .where(eq(reminders.eventId, eventId));\n }\n\n /**\n * 获取用户在指定时间范围内的事件数量\n */\n async getEventCount(userId: number, startDate?: Date, endDate?: Date): Promise<number> {\n const conditions = [eq(calendarEvents.userId, userId)];\n \n if (startDate) {\n conditions.push(gte(calendarEvents.startTime, startDate));\n }\n \n if (endDate) {\n conditions.push(lte(calendarEvents.endTime, endDate));\n }\n\n const result = await this.db\n .select({ count: calendarEvents.id })\n .from(calendarEvents)\n .where(and(...conditions));\n\n return result.length;\n }\n\n /**\n * 搜索事件\n */\n async searchEvents(userId: number, searchTerm: string) {\n const events = await this.db\n .select()\n .from(calendarEvents)\n .where(\n and(\n eq(calendarEvents.userId, userId),\n )\n )\n .orderBy(desc(calendarEvents.startTime));\n\n return events.filter((event: any) => \n event.title.toLowerCase().includes(searchTerm.toLowerCase()) ||\n (event.description && event.description.toLowerCase().includes(searchTerm.toLowerCase()))\n );\n }\n\n /**\n * 批量删除用户的所有事件\n */\n async deleteAllUserEvents(userId: number): Promise<void> {\n await this.db\n .delete(calendarEvents)\n .where(eq(calendarEvents.userId, userId));\n }\n}\n\n\n// 导出单例实例\nexport const calendarDbService = new CalendarDbService();\nexport default calendarDbService; "]}
|