sa2kit 1.6.2 → 1.6.5

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 (128) hide show
  1. package/dist/audioDetection/index.js.map +1 -1
  2. package/dist/audioDetection/index.mjs.map +1 -1
  3. package/dist/auth/index.d.mts +16 -1
  4. package/dist/auth/index.d.ts +16 -1
  5. package/dist/auth/index.js +42 -23
  6. package/dist/auth/index.js.map +1 -1
  7. package/dist/auth/index.mjs +26 -3
  8. package/dist/auth/index.mjs.map +1 -1
  9. package/dist/auth/middleware/index.js +3 -3
  10. package/dist/auth/middleware/index.mjs +2 -2
  11. package/dist/auth/routes/index.js +14 -14
  12. package/dist/auth/routes/index.mjs +2 -2
  13. package/dist/auth/services/index.d.mts +1 -0
  14. package/dist/auth/services/index.d.ts +1 -0
  15. package/dist/auth/services/index.js +7 -7
  16. package/dist/auth/services/index.mjs +1 -1
  17. package/dist/calendar/index.d.mts +1311 -0
  18. package/dist/calendar/index.d.ts +1311 -0
  19. package/dist/calendar/index.js +5360 -0
  20. package/dist/calendar/index.js.map +1 -0
  21. package/dist/calendar/index.mjs +5294 -0
  22. package/dist/calendar/index.mjs.map +1 -0
  23. package/dist/calendar/routes/index.d.mts +118 -0
  24. package/dist/calendar/routes/index.d.ts +118 -0
  25. package/dist/calendar/routes/index.js +335 -0
  26. package/dist/calendar/routes/index.js.map +1 -0
  27. package/dist/calendar/routes/index.mjs +327 -0
  28. package/dist/calendar/routes/index.mjs.map +1 -0
  29. package/dist/calendar/server.d.mts +1189 -0
  30. package/dist/calendar/server.d.ts +1189 -0
  31. package/dist/calendar/server.js +219 -0
  32. package/dist/calendar/server.js.map +1 -0
  33. package/dist/calendar/server.mjs +165 -0
  34. package/dist/calendar/server.mjs.map +1 -0
  35. package/dist/chunk-2ODO4HEI.js +195 -0
  36. package/dist/chunk-2ODO4HEI.js.map +1 -0
  37. package/dist/{chunk-RCNNVNLT.mjs → chunk-3BGPZN4X.mjs} +8 -3
  38. package/dist/chunk-3BGPZN4X.mjs.map +1 -0
  39. package/dist/{chunk-FV3FNHQY.js → chunk-6W5BMXJG.js} +4 -4
  40. package/dist/{chunk-FV3FNHQY.js.map → chunk-6W5BMXJG.js.map} +1 -1
  41. package/dist/{chunk-NMF4ANIC.js → chunk-7Z5LLJ3A.js} +8 -2
  42. package/dist/chunk-7Z5LLJ3A.js.map +1 -0
  43. package/dist/{chunk-42IJ7HEI.js → chunk-CD77U7LZ.js} +5 -5
  44. package/dist/{chunk-42IJ7HEI.js.map → chunk-CD77U7LZ.js.map} +1 -1
  45. package/dist/{chunk-6BL3AZGD.js → chunk-DUHZ7VZP.js} +2 -2
  46. package/dist/chunk-DUHZ7VZP.js.map +1 -0
  47. package/dist/{chunk-6VHWOPRR.mjs → chunk-ESRCX5TQ.mjs} +3 -3
  48. package/dist/{chunk-6VHWOPRR.mjs.map → chunk-ESRCX5TQ.mjs.map} +1 -1
  49. package/dist/chunk-FJU3NA6B.js +318 -0
  50. package/dist/chunk-FJU3NA6B.js.map +1 -0
  51. package/dist/{chunk-DQVPZTVC.js → chunk-G4AMEDO5.js} +2 -2
  52. package/dist/{chunk-DQVPZTVC.js.map → chunk-G4AMEDO5.js.map} +1 -1
  53. package/dist/chunk-GAC4J5GX.js +228 -0
  54. package/dist/chunk-GAC4J5GX.js.map +1 -0
  55. package/dist/chunk-KFDEOLDH.mjs +100 -0
  56. package/dist/chunk-KFDEOLDH.mjs.map +1 -0
  57. package/dist/chunk-NRYHBGU6.js +106 -0
  58. package/dist/chunk-NRYHBGU6.js.map +1 -0
  59. package/dist/chunk-OCIJT5VO.mjs +306 -0
  60. package/dist/chunk-OCIJT5VO.mjs.map +1 -0
  61. package/dist/{chunk-U2L6V7KD.mjs → chunk-OCR5DS4C.mjs} +2 -2
  62. package/dist/chunk-OCR5DS4C.mjs.map +1 -0
  63. package/dist/{chunk-IBLB7ARJ.mjs → chunk-QAT2RWAO.mjs} +3 -3
  64. package/dist/{chunk-IBLB7ARJ.mjs.map → chunk-QAT2RWAO.mjs.map} +1 -1
  65. package/dist/chunk-T6TE7GTY.mjs +218 -0
  66. package/dist/chunk-T6TE7GTY.mjs.map +1 -0
  67. package/dist/chunk-ZCLAF3XN.mjs +182 -0
  68. package/dist/chunk-ZCLAF3XN.mjs.map +1 -0
  69. package/dist/{chunk-5XUE72Y3.mjs → chunk-ZYXF3L6T.mjs} +2 -2
  70. package/dist/{chunk-5XUE72Y3.mjs.map → chunk-ZYXF3L6T.mjs.map} +1 -1
  71. package/dist/imageCrop/index.js.map +1 -1
  72. package/dist/imageCrop/index.mjs.map +1 -1
  73. package/dist/index-DSel44Ke.d.mts +93 -0
  74. package/dist/index-DSel44Ke.d.ts +93 -0
  75. package/dist/index.d.mts +433 -3
  76. package/dist/index.d.ts +433 -3
  77. package/dist/index.js +2148 -64
  78. package/dist/index.js.map +1 -1
  79. package/dist/index.mjs +1980 -33
  80. package/dist/index.mjs.map +1 -1
  81. package/dist/mmd/admin/index.d.mts +1 -1
  82. package/dist/mmd/admin/index.d.ts +1 -1
  83. package/dist/mmd/index.d.mts +94 -3
  84. package/dist/mmd/index.d.ts +94 -3
  85. package/dist/mmd/index.js +677 -180
  86. package/dist/mmd/index.js.map +1 -1
  87. package/dist/mmd/index.mjs +679 -183
  88. package/dist/mmd/index.mjs.map +1 -1
  89. package/dist/mmd/server/index.d.mts +1 -1
  90. package/dist/mmd/server/index.d.ts +1 -1
  91. package/dist/music/index.d.mts +79 -0
  92. package/dist/music/index.d.ts +79 -0
  93. package/dist/music/index.js +58 -0
  94. package/dist/music/index.js.map +1 -0
  95. package/dist/music/index.mjs +5 -0
  96. package/dist/music/index.mjs.map +1 -0
  97. package/dist/music/server/index.d.mts +1 -0
  98. package/dist/music/server/index.d.ts +1 -0
  99. package/dist/music/server/index.js +37 -0
  100. package/dist/music/server/index.js.map +1 -0
  101. package/dist/music/server/index.mjs +4 -0
  102. package/dist/music/server/index.mjs.map +1 -0
  103. package/dist/testYourself/admin/index.js +3 -3
  104. package/dist/testYourself/admin/index.mjs +1 -1
  105. package/dist/testYourself/index.js +7 -7
  106. package/dist/testYourself/index.js.map +1 -1
  107. package/dist/testYourself/index.mjs +2 -2
  108. package/dist/testYourself/index.mjs.map +1 -1
  109. package/dist/{types-DxYJqqes.d.mts → types-B60F7EZZ.d.mts} +16 -1
  110. package/dist/{types-DxYJqqes.d.ts → types-B60F7EZZ.d.ts} +16 -1
  111. package/dist/universalFile/index.d.mts +125 -7
  112. package/dist/universalFile/index.d.ts +125 -7
  113. package/dist/universalFile/index.js +1253 -30
  114. package/dist/universalFile/index.js.map +1 -1
  115. package/dist/universalFile/index.mjs +1244 -23
  116. package/dist/universalFile/index.mjs.map +1 -1
  117. package/dist/universalFile/server/index.js +5 -5
  118. package/dist/universalFile/server/index.mjs +1 -1
  119. package/dist/utils/index.d.mts +5 -1
  120. package/dist/utils/index.d.ts +5 -1
  121. package/dist/utils/index.js +13 -9
  122. package/dist/utils/index.mjs +1 -1
  123. package/package.json +47 -19
  124. package/tailwind.animations.js +5 -0
  125. package/dist/chunk-6BL3AZGD.js.map +0 -1
  126. package/dist/chunk-NMF4ANIC.js.map +0 -1
  127. package/dist/chunk-RCNNVNLT.mjs.map +0 -1
  128. package/dist/chunk-U2L6V7KD.mjs.map +0 -1
@@ -0,0 +1,118 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ interface CalendarRouteConfig {
4
+ /**
5
+ * Drizzle 数据库实例
6
+ * 如果提供,将自动初始化 calendarDbService
7
+ */
8
+ db?: any;
9
+ /**
10
+ * 验证用户身份的函数
11
+ * 应该返回用户信息或 null
12
+ */
13
+ validateAuth: (request: NextRequest) => Promise<{
14
+ id: number;
15
+ } | null>;
16
+ }
17
+ /**
18
+ * 创建获取日历事件列表的处理器
19
+ */
20
+ declare function createGetEventsHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
21
+ success: boolean;
22
+ error: string;
23
+ }> | NextResponse<{
24
+ success: boolean;
25
+ data: any;
26
+ message: string;
27
+ }>>;
28
+ /**
29
+ * 创建日历事件的处理器
30
+ */
31
+ declare function createCreateEventHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
32
+ success: boolean;
33
+ error: string;
34
+ }> | NextResponse<{
35
+ success: boolean;
36
+ data: any;
37
+ message: string;
38
+ }>>;
39
+ /**
40
+ * 创建获取单个事件的处理器
41
+ */
42
+ declare function createGetEventByIdHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
43
+ params: {
44
+ id: string;
45
+ };
46
+ }) => Promise<NextResponse<{
47
+ success: boolean;
48
+ error: string;
49
+ }> | NextResponse<{
50
+ success: boolean;
51
+ data: any;
52
+ message: string;
53
+ }>>;
54
+ /**
55
+ * 创建更新事件的处理器
56
+ */
57
+ declare function createUpdateEventHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
58
+ params: {
59
+ id: string;
60
+ };
61
+ }) => Promise<NextResponse<{
62
+ success: boolean;
63
+ error: string;
64
+ }> | NextResponse<{
65
+ success: boolean;
66
+ data: any;
67
+ message: string;
68
+ }>>;
69
+ /**
70
+ * 创建删除事件的处理器
71
+ */
72
+ declare function createDeleteEventHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
73
+ params: {
74
+ id: string;
75
+ };
76
+ }) => Promise<NextResponse<{
77
+ success: boolean;
78
+ error: string;
79
+ }> | NextResponse<{
80
+ success: boolean;
81
+ message: string;
82
+ }>>;
83
+ /**
84
+ * 创建批量删除事件的处理器
85
+ */
86
+ declare function createBatchDeleteEventsHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
87
+ success: boolean;
88
+ error: string;
89
+ }> | NextResponse<{
90
+ success: boolean;
91
+ data: {
92
+ deletedCount: number;
93
+ };
94
+ message: string;
95
+ }>>;
96
+ /**
97
+ * 创建配置处理器的工厂
98
+ */
99
+ declare function createConfigHandler(config: CalendarRouteConfig): {
100
+ GET: (request: NextRequest) => Promise<NextResponse<{
101
+ success: boolean;
102
+ error: string;
103
+ }> | NextResponse<{
104
+ success: boolean;
105
+ data: any;
106
+ message: string;
107
+ }>>;
108
+ PUT: (request: NextRequest) => Promise<NextResponse<{
109
+ success: boolean;
110
+ error: string;
111
+ }> | NextResponse<{
112
+ success: boolean;
113
+ data: any;
114
+ message: string;
115
+ }>>;
116
+ };
117
+
118
+ export { type CalendarRouteConfig, createBatchDeleteEventsHandler, createConfigHandler, createCreateEventHandler, createDeleteEventHandler, createGetEventByIdHandler, createGetEventsHandler, createUpdateEventHandler };
@@ -0,0 +1,118 @@
1
+ import { NextRequest, NextResponse } from 'next/server';
2
+
3
+ interface CalendarRouteConfig {
4
+ /**
5
+ * Drizzle 数据库实例
6
+ * 如果提供,将自动初始化 calendarDbService
7
+ */
8
+ db?: any;
9
+ /**
10
+ * 验证用户身份的函数
11
+ * 应该返回用户信息或 null
12
+ */
13
+ validateAuth: (request: NextRequest) => Promise<{
14
+ id: number;
15
+ } | null>;
16
+ }
17
+ /**
18
+ * 创建获取日历事件列表的处理器
19
+ */
20
+ declare function createGetEventsHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
21
+ success: boolean;
22
+ error: string;
23
+ }> | NextResponse<{
24
+ success: boolean;
25
+ data: any;
26
+ message: string;
27
+ }>>;
28
+ /**
29
+ * 创建日历事件的处理器
30
+ */
31
+ declare function createCreateEventHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
32
+ success: boolean;
33
+ error: string;
34
+ }> | NextResponse<{
35
+ success: boolean;
36
+ data: any;
37
+ message: string;
38
+ }>>;
39
+ /**
40
+ * 创建获取单个事件的处理器
41
+ */
42
+ declare function createGetEventByIdHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
43
+ params: {
44
+ id: string;
45
+ };
46
+ }) => Promise<NextResponse<{
47
+ success: boolean;
48
+ error: string;
49
+ }> | NextResponse<{
50
+ success: boolean;
51
+ data: any;
52
+ message: string;
53
+ }>>;
54
+ /**
55
+ * 创建更新事件的处理器
56
+ */
57
+ declare function createUpdateEventHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
58
+ params: {
59
+ id: string;
60
+ };
61
+ }) => Promise<NextResponse<{
62
+ success: boolean;
63
+ error: string;
64
+ }> | NextResponse<{
65
+ success: boolean;
66
+ data: any;
67
+ message: string;
68
+ }>>;
69
+ /**
70
+ * 创建删除事件的处理器
71
+ */
72
+ declare function createDeleteEventHandler(config: CalendarRouteConfig): (request: NextRequest, { params }: {
73
+ params: {
74
+ id: string;
75
+ };
76
+ }) => Promise<NextResponse<{
77
+ success: boolean;
78
+ error: string;
79
+ }> | NextResponse<{
80
+ success: boolean;
81
+ message: string;
82
+ }>>;
83
+ /**
84
+ * 创建批量删除事件的处理器
85
+ */
86
+ declare function createBatchDeleteEventsHandler(config: CalendarRouteConfig): (request: NextRequest) => Promise<NextResponse<{
87
+ success: boolean;
88
+ error: string;
89
+ }> | NextResponse<{
90
+ success: boolean;
91
+ data: {
92
+ deletedCount: number;
93
+ };
94
+ message: string;
95
+ }>>;
96
+ /**
97
+ * 创建配置处理器的工厂
98
+ */
99
+ declare function createConfigHandler(config: CalendarRouteConfig): {
100
+ GET: (request: NextRequest) => Promise<NextResponse<{
101
+ success: boolean;
102
+ error: string;
103
+ }> | NextResponse<{
104
+ success: boolean;
105
+ data: any;
106
+ message: string;
107
+ }>>;
108
+ PUT: (request: NextRequest) => Promise<NextResponse<{
109
+ success: boolean;
110
+ error: string;
111
+ }> | NextResponse<{
112
+ success: boolean;
113
+ data: any;
114
+ message: string;
115
+ }>>;
116
+ };
117
+
118
+ export { type CalendarRouteConfig, createBatchDeleteEventsHandler, createConfigHandler, createCreateEventHandler, createDeleteEventHandler, createGetEventByIdHandler, createGetEventsHandler, createUpdateEventHandler };
@@ -0,0 +1,335 @@
1
+ 'use strict';
2
+
3
+ var chunkFJU3NA6B_js = require('../../chunk-FJU3NA6B.js');
4
+ require('../../chunk-SVWQN2LR.js');
5
+ require('../../chunk-DGUM43GV.js');
6
+ var server = require('next/server');
7
+
8
+ function initDbService(db) {
9
+ if (db) {
10
+ chunkFJU3NA6B_js.calendarDbService.setDb(db);
11
+ }
12
+ }
13
+ function createGetEventsHandler(config) {
14
+ initDbService(config.db);
15
+ return async (request) => {
16
+ try {
17
+ const user = await config.validateAuth(request);
18
+ if (!user) {
19
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
20
+ }
21
+ const { searchParams } = new URL(request.url);
22
+ const startDateStr = searchParams.get("startDate");
23
+ const endDateStr = searchParams.get("endDate");
24
+ let startDate;
25
+ let endDate;
26
+ if (startDateStr) {
27
+ startDate = new Date(startDateStr);
28
+ if (isNaN(startDate.getTime())) {
29
+ return server.NextResponse.json({ success: false, error: "\u5F00\u59CB\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
30
+ }
31
+ }
32
+ if (endDateStr) {
33
+ endDate = new Date(endDateStr);
34
+ if (isNaN(endDate.getTime())) {
35
+ return server.NextResponse.json({ success: false, error: "\u7ED3\u675F\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
36
+ }
37
+ }
38
+ const events = await chunkFJU3NA6B_js.calendarDbService.getAllEvents(user.id, startDate, endDate);
39
+ return server.NextResponse.json({
40
+ success: true,
41
+ data: events,
42
+ message: "\u83B7\u53D6\u4E8B\u4EF6\u5217\u8868\u6210\u529F"
43
+ });
44
+ } catch (error) {
45
+ console.error("\u83B7\u53D6\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
46
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
47
+ }
48
+ };
49
+ }
50
+ function createCreateEventHandler(config) {
51
+ initDbService(config.db);
52
+ return async (request) => {
53
+ try {
54
+ const user = await config.validateAuth(request);
55
+ if (!user) {
56
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
57
+ }
58
+ const body = await request.json();
59
+ if (!body.title || typeof body.title !== "string" || body.title.trim() === "") {
60
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u6807\u9898\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
61
+ }
62
+ if (!body.startTime || !body.endTime) {
63
+ return server.NextResponse.json({ success: false, error: "\u5F00\u59CB\u65F6\u95F4\u548C\u7ED3\u675F\u65F6\u95F4\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
64
+ }
65
+ const startTime = new Date(body.startTime);
66
+ const endTime = new Date(body.endTime);
67
+ if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {
68
+ return server.NextResponse.json({ success: false, error: "\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
69
+ }
70
+ if (startTime.getTime() >= endTime.getTime()) {
71
+ return server.NextResponse.json({ success: false, error: "\u7ED3\u675F\u65F6\u95F4\u5FC5\u987B\u665A\u4E8E\u5F00\u59CB\u65F6\u95F4" }, { status: 400 });
72
+ }
73
+ const eventData = {
74
+ title: body.title.trim(),
75
+ description: body.description || null,
76
+ startTime,
77
+ endTime,
78
+ allDay: Boolean(body.allDay),
79
+ location: body.location || null,
80
+ color: body.color || "#3B82F6",
81
+ userId: user.id
82
+ };
83
+ const newEvent = await chunkFJU3NA6B_js.calendarDbService.createEvent(eventData);
84
+ if (body.recurrence) {
85
+ await chunkFJU3NA6B_js.calendarDbService.createRecurrenceRule({
86
+ eventId: newEvent.id,
87
+ ...body.recurrence,
88
+ endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
89
+ });
90
+ }
91
+ if (body.reminders && Array.isArray(body.reminders)) {
92
+ for (const reminder of body.reminders) {
93
+ if (reminder.reminderTime) {
94
+ await chunkFJU3NA6B_js.calendarDbService.createReminder({
95
+ eventId: newEvent.id,
96
+ reminderTime: new Date(reminder.reminderTime),
97
+ reminderType: reminder.reminderType || "notification",
98
+ status: "pending"
99
+ });
100
+ }
101
+ }
102
+ }
103
+ return server.NextResponse.json({
104
+ success: true,
105
+ data: newEvent,
106
+ message: "\u521B\u5EFA\u4E8B\u4EF6\u6210\u529F"
107
+ });
108
+ } catch (error) {
109
+ console.error("\u521B\u5EFA\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
110
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
111
+ }
112
+ };
113
+ }
114
+ function createGetEventByIdHandler(config) {
115
+ initDbService(config.db);
116
+ return async (request, { params }) => {
117
+ try {
118
+ const user = await config.validateAuth(request);
119
+ if (!user) {
120
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
121
+ }
122
+ const eventId = parseInt(params.id);
123
+ if (isNaN(eventId)) {
124
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
125
+ }
126
+ const event = await chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
127
+ if (!event) {
128
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728" }, { status: 404 });
129
+ }
130
+ if (event.userId !== user.id) {
131
+ return server.NextResponse.json({ success: false, error: "\u65E0\u6743\u8BBF\u95EE\u6B64\u4E8B\u4EF6" }, { status: 403 });
132
+ }
133
+ const [recurrenceRule, reminders] = await Promise.all([
134
+ chunkFJU3NA6B_js.calendarDbService.getRecurrenceRule(eventId),
135
+ chunkFJU3NA6B_js.calendarDbService.getEventReminders(eventId)
136
+ ]);
137
+ return server.NextResponse.json({
138
+ success: true,
139
+ data: {
140
+ ...event,
141
+ recurrenceRule: recurrenceRule || void 0,
142
+ reminders: reminders || []
143
+ },
144
+ message: "\u83B7\u53D6\u4E8B\u4EF6\u6210\u529F"
145
+ });
146
+ } catch (error) {
147
+ console.error("\u83B7\u53D6\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
148
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
149
+ }
150
+ };
151
+ }
152
+ function createUpdateEventHandler(config) {
153
+ initDbService(config.db);
154
+ return async (request, { params }) => {
155
+ try {
156
+ const user = await config.validateAuth(request);
157
+ if (!user) {
158
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
159
+ }
160
+ const eventId = parseInt(params.id);
161
+ if (isNaN(eventId)) {
162
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
163
+ }
164
+ const existingEvent = await chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
165
+ if (!existingEvent || existingEvent.userId !== user.id) {
166
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u4FEE\u6539" }, { status: 404 });
167
+ }
168
+ const body = await request.json();
169
+ const updateData = {};
170
+ if (body.title !== void 0) updateData.title = body.title.trim();
171
+ if (body.description !== void 0) updateData.description = body.description;
172
+ if (body.startTime !== void 0) updateData.startTime = new Date(body.startTime);
173
+ if (body.endTime !== void 0) updateData.endTime = new Date(body.endTime);
174
+ if (body.allDay !== void 0) updateData.allDay = Boolean(body.allDay);
175
+ if (body.location !== void 0) updateData.location = body.location;
176
+ if (body.color !== void 0) updateData.color = body.color;
177
+ const updatedEvent = await chunkFJU3NA6B_js.calendarDbService.updateEvent(eventId, updateData);
178
+ if (body.recurrence !== void 0) {
179
+ await chunkFJU3NA6B_js.calendarDbService.deleteRecurrenceRule(eventId);
180
+ if (body.recurrence) {
181
+ await chunkFJU3NA6B_js.calendarDbService.createRecurrenceRule({
182
+ eventId,
183
+ ...body.recurrence,
184
+ endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
185
+ });
186
+ }
187
+ }
188
+ if (body.reminders !== void 0) {
189
+ await chunkFJU3NA6B_js.calendarDbService.deleteEventReminders(eventId);
190
+ if (Array.isArray(body.reminders)) {
191
+ for (const reminder of body.reminders) {
192
+ if (reminder.reminderTime) {
193
+ await chunkFJU3NA6B_js.calendarDbService.createReminder({
194
+ eventId,
195
+ reminderTime: new Date(reminder.reminderTime),
196
+ reminderType: reminder.reminderType || "notification",
197
+ status: "pending"
198
+ });
199
+ }
200
+ }
201
+ }
202
+ }
203
+ return server.NextResponse.json({
204
+ success: true,
205
+ data: updatedEvent,
206
+ message: "\u66F4\u65B0\u4E8B\u4EF6\u6210\u529F"
207
+ });
208
+ } catch (error) {
209
+ console.error("\u66F4\u65B0\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
210
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
211
+ }
212
+ };
213
+ }
214
+ function createDeleteEventHandler(config) {
215
+ initDbService(config.db);
216
+ return async (request, { params }) => {
217
+ try {
218
+ const user = await config.validateAuth(request);
219
+ if (!user) {
220
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
221
+ }
222
+ const eventId = parseInt(params.id);
223
+ if (isNaN(eventId)) {
224
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
225
+ }
226
+ const existingEvent = await chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
227
+ if (!existingEvent || existingEvent.userId !== user.id) {
228
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u5220\u9664" }, { status: 404 });
229
+ }
230
+ await chunkFJU3NA6B_js.calendarDbService.deleteEvent(eventId);
231
+ return server.NextResponse.json({
232
+ success: true,
233
+ message: "\u5220\u9664\u4E8B\u4EF6\u6210\u529F"
234
+ });
235
+ } catch (error) {
236
+ console.error("\u5220\u9664\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
237
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
238
+ }
239
+ };
240
+ }
241
+ function createBatchDeleteEventsHandler(config) {
242
+ initDbService(config.db);
243
+ return async (request) => {
244
+ try {
245
+ const user = await config.validateAuth(request);
246
+ if (!user) {
247
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
248
+ }
249
+ const body = await request.json();
250
+ if (!body.eventIds || !Array.isArray(body.eventIds)) {
251
+ return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u5217\u8868\u4E0D\u80FD\u4E3A\u7A7A" }, { status: 400 });
252
+ }
253
+ const results = await Promise.all(
254
+ body.eventIds.map(async (id) => {
255
+ const event = await chunkFJU3NA6B_js.calendarDbService.getEventById(id);
256
+ if (event && event.userId === user.id) {
257
+ await chunkFJU3NA6B_js.calendarDbService.deleteEvent(id);
258
+ return true;
259
+ }
260
+ return false;
261
+ })
262
+ );
263
+ const deletedCount = results.filter(Boolean).length;
264
+ return server.NextResponse.json({
265
+ success: true,
266
+ data: { deletedCount },
267
+ message: `\u6210\u529F\u5220\u9664 ${deletedCount} \u4E2A\u4E8B\u4EF6`
268
+ });
269
+ } catch (error) {
270
+ console.error("\u6279\u91CF\u5220\u9664\u4E8B\u4EF6\u5931\u8D25\uFF1A", error);
271
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
272
+ }
273
+ };
274
+ }
275
+ function createConfigHandler(config) {
276
+ initDbService(config.db);
277
+ return {
278
+ GET: async (request) => {
279
+ try {
280
+ const user = await config.validateAuth(request);
281
+ if (!user) {
282
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
283
+ }
284
+ const dbConfig = await chunkFJU3NA6B_js.calendarDbService.getUserConfig(user.id);
285
+ return server.NextResponse.json({
286
+ success: true,
287
+ data: dbConfig || {
288
+ firstDayOfWeek: 1,
289
+ workingHoursStart: "09:00",
290
+ workingHoursEnd: "18:00",
291
+ timeZone: "Asia/Shanghai",
292
+ dateFormat: "YYYY-MM-DD",
293
+ timeFormat: "HH:mm",
294
+ defaultView: "month",
295
+ defaultEventColor: "#3B82F6",
296
+ weekends: true,
297
+ eventColors: {}
298
+ },
299
+ message: "\u83B7\u53D6\u914D\u7F6E\u6210\u529F"
300
+ });
301
+ } catch (error) {
302
+ console.error("\u83B7\u53D6\u914D\u7F6E\u5931\u8D25\uFF1A", error);
303
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
304
+ }
305
+ },
306
+ PUT: async (request) => {
307
+ try {
308
+ const user = await config.validateAuth(request);
309
+ if (!user) {
310
+ return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
311
+ }
312
+ const body = await request.json();
313
+ const updatedConfig = await chunkFJU3NA6B_js.calendarDbService.upsertUserConfig(user.id, body);
314
+ return server.NextResponse.json({
315
+ success: true,
316
+ data: updatedConfig,
317
+ message: "\u66F4\u65B0\u914D\u7F6E\u6210\u529F"
318
+ });
319
+ } catch (error) {
320
+ console.error("\u66F4\u65B0\u914D\u7F6E\u5931\u8D25\uFF1A", error);
321
+ return server.NextResponse.json({ success: false, error: "\u670D\u52A1\u5668\u5185\u90E8\u9519\u8BEF" }, { status: 500 });
322
+ }
323
+ }
324
+ };
325
+ }
326
+
327
+ exports.createBatchDeleteEventsHandler = createBatchDeleteEventsHandler;
328
+ exports.createConfigHandler = createConfigHandler;
329
+ exports.createCreateEventHandler = createCreateEventHandler;
330
+ exports.createDeleteEventHandler = createDeleteEventHandler;
331
+ exports.createGetEventByIdHandler = createGetEventByIdHandler;
332
+ exports.createGetEventsHandler = createGetEventsHandler;
333
+ exports.createUpdateEventHandler = createUpdateEventHandler;
334
+ //# sourceMappingURL=index.js.map
335
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/calendar/routes/index.ts"],"names":["calendarDbService","NextResponse"],"mappings":"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","file":"index.js","sourcesContent":["import { NextRequest, NextResponse } from 'next/server';\nimport { calendarDbService } from '../db/calendarDbService';\n\nexport interface CalendarRouteConfig {\n /**\n * Drizzle 数据库实例\n * 如果提供,将自动初始化 calendarDbService\n */\n db?: any;\n /**\n * 验证用户身份的函数\n * 应该返回用户信息或 null\n */\n validateAuth: (request: NextRequest) => Promise<{ id: number } | null>;\n}\n\n/**\n * 初始化数据库服务的辅助函数\n */\nfunction initDbService(db?: any) {\n if (db) {\n calendarDbService.setDb(db);\n }\n}\n\n/**\n * 创建获取日历事件列表的处理器\n */\nexport function createGetEventsHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const { searchParams } = new URL(request.url);\n const startDateStr = searchParams.get('startDate');\n const endDateStr = searchParams.get('endDate');\n\n let startDate: Date | undefined;\n let endDate: Date | undefined;\n\n if (startDateStr) {\n startDate = new Date(startDateStr);\n if (isNaN(startDate.getTime())) {\n return NextResponse.json({ success: false, error: '开始日期格式无效' }, { status: 400 });\n }\n }\n\n if (endDateStr) {\n endDate = new Date(endDateStr);\n if (isNaN(endDate.getTime())) {\n return NextResponse.json({ success: false, error: '结束日期格式无效' }, { status: 400 });\n }\n }\n\n const events = await calendarDbService.getAllEvents(user.id, startDate, endDate);\n\n return NextResponse.json({\n success: true,\n data: events,\n message: '获取事件列表成功'\n });\n } catch (error) {\n console.error('获取事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建日历事件的处理器\n */\nexport function createCreateEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n \n if (!body.title || typeof body.title !== 'string' || body.title.trim() === '') {\n return NextResponse.json({ success: false, error: '事件标题不能为空' }, { status: 400 });\n }\n\n if (!body.startTime || !body.endTime) {\n return NextResponse.json({ success: false, error: '开始时间和结束时间不能为空' }, { status: 400 });\n }\n\n const startTime = new Date(body.startTime);\n const endTime = new Date(body.endTime);\n\n if (isNaN(startTime.getTime()) || isNaN(endTime.getTime())) {\n return NextResponse.json({ success: false, error: '日期格式无效' }, { status: 400 });\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n return NextResponse.json({ success: false, error: '结束时间必须晚于开始时间' }, { status: 400 });\n }\n\n const eventData = {\n title: body.title.trim(),\n description: body.description || null,\n startTime,\n endTime,\n allDay: Boolean(body.allDay),\n location: body.location || null,\n color: body.color || '#3B82F6',\n userId: user.id,\n };\n\n const newEvent = await calendarDbService.createEvent(eventData);\n\n if (body.recurrence) {\n await calendarDbService.createRecurrenceRule({\n eventId: newEvent.id,\n ...body.recurrence,\n endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : undefined,\n });\n }\n\n if (body.reminders && Array.isArray(body.reminders)) {\n for (const reminder of body.reminders) {\n if (reminder.reminderTime) {\n await calendarDbService.createReminder({\n eventId: newEvent.id,\n reminderTime: new Date(reminder.reminderTime),\n reminderType: reminder.reminderType || 'notification',\n status: 'pending'\n });\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: newEvent,\n message: '创建事件成功'\n });\n } catch (error) {\n console.error('创建事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建获取单个事件的处理器\n */\nexport function createGetEventByIdHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const event = await calendarDbService.getEventById(eventId);\n if (!event) {\n return NextResponse.json({ success: false, error: '事件不存在' }, { status: 404 });\n }\n\n if (event.userId !== user.id) {\n return NextResponse.json({ success: false, error: '无权访问此事件' }, { status: 403 });\n }\n\n const [recurrenceRule, reminders] = await Promise.all([\n calendarDbService.getRecurrenceRule(eventId),\n calendarDbService.getEventReminders(eventId)\n ]);\n\n return NextResponse.json({\n success: true,\n data: {\n ...event,\n recurrenceRule: recurrenceRule || undefined,\n reminders: reminders || []\n },\n message: '获取事件成功'\n });\n } catch (error) {\n console.error('获取事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建更新事件的处理器\n */\nexport function createUpdateEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const existingEvent = await calendarDbService.getEventById(eventId);\n if (!existingEvent || existingEvent.userId !== user.id) {\n return NextResponse.json({ success: false, error: '事件不存在或无权修改' }, { status: 404 });\n }\n\n const body = await request.json();\n const updateData: any = {};\n\n if (body.title !== undefined) updateData.title = body.title.trim();\n if (body.description !== undefined) updateData.description = body.description;\n if (body.startTime !== undefined) updateData.startTime = new Date(body.startTime);\n if (body.endTime !== undefined) updateData.endTime = new Date(body.endTime);\n if (body.allDay !== undefined) updateData.allDay = Boolean(body.allDay);\n if (body.location !== undefined) updateData.location = body.location;\n if (body.color !== undefined) updateData.color = body.color;\n\n const updatedEvent = await calendarDbService.updateEvent(eventId, updateData);\n\n if (body.recurrence !== undefined) {\n await calendarDbService.deleteRecurrenceRule(eventId);\n if (body.recurrence) {\n await calendarDbService.createRecurrenceRule({\n eventId,\n ...body.recurrence,\n endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : undefined,\n });\n }\n }\n\n if (body.reminders !== undefined) {\n await calendarDbService.deleteEventReminders(eventId);\n if (Array.isArray(body.reminders)) {\n for (const reminder of body.reminders) {\n if (reminder.reminderTime) {\n await calendarDbService.createReminder({\n eventId,\n reminderTime: new Date(reminder.reminderTime),\n reminderType: reminder.reminderType || 'notification',\n status: 'pending'\n });\n }\n }\n }\n }\n\n return NextResponse.json({\n success: true,\n data: updatedEvent,\n message: '更新事件成功'\n });\n } catch (error) {\n console.error('更新事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建删除事件的处理器\n */\nexport function createDeleteEventHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest, { params }: { params: { id: string } }) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const eventId = parseInt(params.id);\n if (isNaN(eventId)) {\n return NextResponse.json({ success: false, error: '事件ID无效' }, { status: 400 });\n }\n\n const existingEvent = await calendarDbService.getEventById(eventId);\n if (!existingEvent || existingEvent.userId !== user.id) {\n return NextResponse.json({ success: false, error: '事件不存在或无权删除' }, { status: 404 });\n }\n\n await calendarDbService.deleteEvent(eventId);\n\n return NextResponse.json({\n success: true,\n message: '删除事件成功'\n });\n } catch (error) {\n console.error('删除事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建批量删除事件的处理器\n */\nexport function createBatchDeleteEventsHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n if (!body.eventIds || !Array.isArray(body.eventIds)) {\n return NextResponse.json({ success: false, error: '事件ID列表不能为空' }, { status: 400 });\n }\n\n const results = await Promise.all(\n body.eventIds.map(async (id: number) => {\n const event = await calendarDbService.getEventById(id);\n if (event && event.userId === user.id) {\n await calendarDbService.deleteEvent(id);\n return true;\n }\n return false;\n })\n );\n\n const deletedCount = results.filter(Boolean).length;\n\n return NextResponse.json({\n success: true,\n data: { deletedCount },\n message: `成功删除 ${deletedCount} 个事件`\n });\n } catch (error) {\n console.error('批量删除事件失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n };\n}\n\n/**\n * 创建配置处理器的工厂\n */\nexport function createConfigHandler(config: CalendarRouteConfig) {\n initDbService(config.db);\n return {\n GET: async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const dbConfig = await calendarDbService.getUserConfig(user.id);\n return NextResponse.json({\n success: true,\n data: dbConfig || {\n firstDayOfWeek: 1,\n workingHoursStart: '09:00',\n workingHoursEnd: '18:00',\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month',\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {}\n },\n message: '获取配置成功'\n });\n } catch (error) {\n console.error('获取配置失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n },\n PUT: async (request: NextRequest) => {\n try {\n const user = await config.validateAuth(request);\n if (!user) {\n return NextResponse.json({ success: false, error: '未授权访问' }, { status: 401 });\n }\n\n const body = await request.json();\n const updatedConfig = await calendarDbService.upsertUserConfig(user.id, body);\n\n return NextResponse.json({\n success: true,\n data: updatedConfig,\n message: '更新配置成功'\n });\n } catch (error) {\n console.error('更新配置失败:', error);\n return NextResponse.json({ success: false, error: '服务器内部错误' }, { status: 500 });\n }\n }\n };\n}\n\n"]}