sa2kit 1.6.5 → 1.6.6
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/auth/index.d.mts +11 -1
- package/dist/auth/index.d.ts +11 -1
- package/dist/auth/index.js +9 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/index.mjs +9 -1
- package/dist/auth/index.mjs.map +1 -1
- package/dist/calendar/index.d.mts +497 -611
- package/dist/calendar/index.d.ts +497 -611
- package/dist/calendar/index.js +4104 -4088
- package/dist/calendar/index.js.map +1 -1
- package/dist/calendar/index.mjs +4092 -4075
- package/dist/calendar/index.mjs.map +1 -1
- package/dist/calendar/routes/index.js +21 -21
- package/dist/calendar/routes/index.mjs +1 -1
- package/dist/calendar/server.d.mts +3 -8
- package/dist/calendar/server.d.ts +3 -8
- package/dist/calendar/server.js +14 -14
- package/dist/calendar/server.js.map +1 -1
- package/dist/calendar/server.mjs +3 -3
- package/dist/calendar/server.mjs.map +1 -1
- package/dist/{chunk-OCIJT5VO.mjs → chunk-6WXOA4BE.mjs} +3 -7
- package/dist/chunk-6WXOA4BE.mjs.map +1 -0
- package/dist/{chunk-FJU3NA6B.js → chunk-AXP7KROR.js} +3 -7
- package/dist/chunk-AXP7KROR.js.map +1 -0
- package/dist/{chunk-NRYHBGU6.js → chunk-IEA55H3G.js} +5 -5
- package/dist/chunk-IEA55H3G.js.map +1 -0
- package/dist/{chunk-KFDEOLDH.mjs → chunk-R2F4BXUU.mjs} +5 -5
- package/dist/chunk-R2F4BXUU.mjs.map +1 -0
- package/dist/index.d.mts +96 -103
- package/dist/index.d.ts +96 -103
- package/dist/index.js +433 -466
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +371 -402
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-FJU3NA6B.js.map +0 -1
- package/dist/chunk-KFDEOLDH.mjs.map +0 -1
- package/dist/chunk-NRYHBGU6.js.map +0 -1
- package/dist/chunk-OCIJT5VO.mjs.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkAXP7KROR_js = require('../../chunk-AXP7KROR.js');
|
|
4
4
|
require('../../chunk-SVWQN2LR.js');
|
|
5
5
|
require('../../chunk-DGUM43GV.js');
|
|
6
6
|
var server = require('next/server');
|
|
7
7
|
|
|
8
8
|
function initDbService(db) {
|
|
9
9
|
if (db) {
|
|
10
|
-
|
|
10
|
+
chunkAXP7KROR_js.calendarDbService.setDb(db);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
function createGetEventsHandler(config) {
|
|
@@ -35,7 +35,7 @@ function createGetEventsHandler(config) {
|
|
|
35
35
|
return server.NextResponse.json({ success: false, error: "\u7ED3\u675F\u65E5\u671F\u683C\u5F0F\u65E0\u6548" }, { status: 400 });
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
const events = await
|
|
38
|
+
const events = await chunkAXP7KROR_js.calendarDbService.getAllEvents(user.id, startDate, endDate);
|
|
39
39
|
return server.NextResponse.json({
|
|
40
40
|
success: true,
|
|
41
41
|
data: events,
|
|
@@ -80,9 +80,9 @@ function createCreateEventHandler(config) {
|
|
|
80
80
|
color: body.color || "#3B82F6",
|
|
81
81
|
userId: user.id
|
|
82
82
|
};
|
|
83
|
-
const newEvent = await
|
|
83
|
+
const newEvent = await chunkAXP7KROR_js.calendarDbService.createEvent(eventData);
|
|
84
84
|
if (body.recurrence) {
|
|
85
|
-
await
|
|
85
|
+
await chunkAXP7KROR_js.calendarDbService.createRecurrenceRule({
|
|
86
86
|
eventId: newEvent.id,
|
|
87
87
|
...body.recurrence,
|
|
88
88
|
endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
|
|
@@ -91,7 +91,7 @@ function createCreateEventHandler(config) {
|
|
|
91
91
|
if (body.reminders && Array.isArray(body.reminders)) {
|
|
92
92
|
for (const reminder of body.reminders) {
|
|
93
93
|
if (reminder.reminderTime) {
|
|
94
|
-
await
|
|
94
|
+
await chunkAXP7KROR_js.calendarDbService.createReminder({
|
|
95
95
|
eventId: newEvent.id,
|
|
96
96
|
reminderTime: new Date(reminder.reminderTime),
|
|
97
97
|
reminderType: reminder.reminderType || "notification",
|
|
@@ -123,7 +123,7 @@ function createGetEventByIdHandler(config) {
|
|
|
123
123
|
if (isNaN(eventId)) {
|
|
124
124
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
|
|
125
125
|
}
|
|
126
|
-
const event = await
|
|
126
|
+
const event = await chunkAXP7KROR_js.calendarDbService.getEventById(eventId);
|
|
127
127
|
if (!event) {
|
|
128
128
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728" }, { status: 404 });
|
|
129
129
|
}
|
|
@@ -131,8 +131,8 @@ function createGetEventByIdHandler(config) {
|
|
|
131
131
|
return server.NextResponse.json({ success: false, error: "\u65E0\u6743\u8BBF\u95EE\u6B64\u4E8B\u4EF6" }, { status: 403 });
|
|
132
132
|
}
|
|
133
133
|
const [recurrenceRule, reminders] = await Promise.all([
|
|
134
|
-
|
|
135
|
-
|
|
134
|
+
chunkAXP7KROR_js.calendarDbService.getRecurrenceRule(eventId),
|
|
135
|
+
chunkAXP7KROR_js.calendarDbService.getEventReminders(eventId)
|
|
136
136
|
]);
|
|
137
137
|
return server.NextResponse.json({
|
|
138
138
|
success: true,
|
|
@@ -161,7 +161,7 @@ function createUpdateEventHandler(config) {
|
|
|
161
161
|
if (isNaN(eventId)) {
|
|
162
162
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
|
|
163
163
|
}
|
|
164
|
-
const existingEvent = await
|
|
164
|
+
const existingEvent = await chunkAXP7KROR_js.calendarDbService.getEventById(eventId);
|
|
165
165
|
if (!existingEvent || existingEvent.userId !== user.id) {
|
|
166
166
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u4FEE\u6539" }, { status: 404 });
|
|
167
167
|
}
|
|
@@ -174,11 +174,11 @@ function createUpdateEventHandler(config) {
|
|
|
174
174
|
if (body.allDay !== void 0) updateData.allDay = Boolean(body.allDay);
|
|
175
175
|
if (body.location !== void 0) updateData.location = body.location;
|
|
176
176
|
if (body.color !== void 0) updateData.color = body.color;
|
|
177
|
-
const updatedEvent = await
|
|
177
|
+
const updatedEvent = await chunkAXP7KROR_js.calendarDbService.updateEvent(eventId, updateData);
|
|
178
178
|
if (body.recurrence !== void 0) {
|
|
179
|
-
await
|
|
179
|
+
await chunkAXP7KROR_js.calendarDbService.deleteRecurrenceRule(eventId);
|
|
180
180
|
if (body.recurrence) {
|
|
181
|
-
await
|
|
181
|
+
await chunkAXP7KROR_js.calendarDbService.createRecurrenceRule({
|
|
182
182
|
eventId,
|
|
183
183
|
...body.recurrence,
|
|
184
184
|
endDate: body.recurrence.endDate ? new Date(body.recurrence.endDate) : void 0
|
|
@@ -186,11 +186,11 @@ function createUpdateEventHandler(config) {
|
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
if (body.reminders !== void 0) {
|
|
189
|
-
await
|
|
189
|
+
await chunkAXP7KROR_js.calendarDbService.deleteEventReminders(eventId);
|
|
190
190
|
if (Array.isArray(body.reminders)) {
|
|
191
191
|
for (const reminder of body.reminders) {
|
|
192
192
|
if (reminder.reminderTime) {
|
|
193
|
-
await
|
|
193
|
+
await chunkAXP7KROR_js.calendarDbService.createReminder({
|
|
194
194
|
eventId,
|
|
195
195
|
reminderTime: new Date(reminder.reminderTime),
|
|
196
196
|
reminderType: reminder.reminderType || "notification",
|
|
@@ -223,11 +223,11 @@ function createDeleteEventHandler(config) {
|
|
|
223
223
|
if (isNaN(eventId)) {
|
|
224
224
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6ID\u65E0\u6548" }, { status: 400 });
|
|
225
225
|
}
|
|
226
|
-
const existingEvent = await
|
|
226
|
+
const existingEvent = await chunkAXP7KROR_js.calendarDbService.getEventById(eventId);
|
|
227
227
|
if (!existingEvent || existingEvent.userId !== user.id) {
|
|
228
228
|
return server.NextResponse.json({ success: false, error: "\u4E8B\u4EF6\u4E0D\u5B58\u5728\u6216\u65E0\u6743\u5220\u9664" }, { status: 404 });
|
|
229
229
|
}
|
|
230
|
-
await
|
|
230
|
+
await chunkAXP7KROR_js.calendarDbService.deleteEvent(eventId);
|
|
231
231
|
return server.NextResponse.json({
|
|
232
232
|
success: true,
|
|
233
233
|
message: "\u5220\u9664\u4E8B\u4EF6\u6210\u529F"
|
|
@@ -252,9 +252,9 @@ function createBatchDeleteEventsHandler(config) {
|
|
|
252
252
|
}
|
|
253
253
|
const results = await Promise.all(
|
|
254
254
|
body.eventIds.map(async (id) => {
|
|
255
|
-
const event = await
|
|
255
|
+
const event = await chunkAXP7KROR_js.calendarDbService.getEventById(id);
|
|
256
256
|
if (event && event.userId === user.id) {
|
|
257
|
-
await
|
|
257
|
+
await chunkAXP7KROR_js.calendarDbService.deleteEvent(id);
|
|
258
258
|
return true;
|
|
259
259
|
}
|
|
260
260
|
return false;
|
|
@@ -281,7 +281,7 @@ function createConfigHandler(config) {
|
|
|
281
281
|
if (!user) {
|
|
282
282
|
return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
|
|
283
283
|
}
|
|
284
|
-
const dbConfig = await
|
|
284
|
+
const dbConfig = await chunkAXP7KROR_js.calendarDbService.getUserConfig(user.id);
|
|
285
285
|
return server.NextResponse.json({
|
|
286
286
|
success: true,
|
|
287
287
|
data: dbConfig || {
|
|
@@ -310,7 +310,7 @@ function createConfigHandler(config) {
|
|
|
310
310
|
return server.NextResponse.json({ success: false, error: "\u672A\u6388\u6743\u8BBF\u95EE" }, { status: 401 });
|
|
311
311
|
}
|
|
312
312
|
const body = await request.json();
|
|
313
|
-
const updatedConfig = await
|
|
313
|
+
const updatedConfig = await chunkAXP7KROR_js.calendarDbService.upsertUserConfig(user.id, body);
|
|
314
314
|
return server.NextResponse.json({
|
|
315
315
|
success: true,
|
|
316
316
|
data: updatedConfig,
|
|
@@ -5,7 +5,7 @@ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
|
5
5
|
* 简化版日历数据库服务
|
|
6
6
|
*
|
|
7
7
|
* 提供基础的数据库操作,避免复杂的类型转换
|
|
8
|
-
*
|
|
8
|
+
* 后续可以根据需要逐步完善
|
|
9
9
|
*/
|
|
10
10
|
declare class CalendarDbService {
|
|
11
11
|
private _db;
|
|
@@ -1095,12 +1095,7 @@ declare const eventSharesRelations: drizzle_orm.Relations<"event_shares", {
|
|
|
1095
1095
|
*
|
|
1096
1096
|
* 使用方式:
|
|
1097
1097
|
* ```typescript
|
|
1098
|
-
* import { calendarDbService } from '
|
|
1099
|
-
* ```
|
|
1100
|
-
*
|
|
1101
|
-
* 对于 API 路由处理器,请使用:
|
|
1102
|
-
* ```typescript
|
|
1103
|
-
* import { createGetEventsHandler } from '@qhr123/sa2kit/calendar/routes';
|
|
1098
|
+
* import { calendarDbService } from 'sa2kit/calendar/server';
|
|
1104
1099
|
* ```
|
|
1105
1100
|
*
|
|
1106
1101
|
* @version 1.0.0
|
|
@@ -1184,6 +1179,6 @@ declare function createSuccessResponse(data: any, message?: string): Response;
|
|
|
1184
1179
|
*/
|
|
1185
1180
|
declare function checkEventPermission(eventId: number, userId: number, requiredPermission?: 'read' | 'write'): Promise<boolean>;
|
|
1186
1181
|
declare const CALENDAR_SERVER_MODULE_VERSION = "1.0.0";
|
|
1187
|
-
declare const CALENDAR_SERVER_MODULE_NAME = "
|
|
1182
|
+
declare const CALENDAR_SERVER_MODULE_NAME = "sa2kit/calendar/server";
|
|
1188
1183
|
|
|
1189
1184
|
export { CALENDAR_SERVER_MODULE_NAME, CALENDAR_SERVER_MODULE_VERSION, DEFAULT_CALENDAR_CONFIG, calculateReminderTime, calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, checkEventPermission, createErrorResponse, createSuccessResponse, eventShares, eventSharesRelations, generateRecurrenceInstances, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations, validateEventData, validateRecurrenceData };
|
|
@@ -5,7 +5,7 @@ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
|
5
5
|
* 简化版日历数据库服务
|
|
6
6
|
*
|
|
7
7
|
* 提供基础的数据库操作,避免复杂的类型转换
|
|
8
|
-
*
|
|
8
|
+
* 后续可以根据需要逐步完善
|
|
9
9
|
*/
|
|
10
10
|
declare class CalendarDbService {
|
|
11
11
|
private _db;
|
|
@@ -1095,12 +1095,7 @@ declare const eventSharesRelations: drizzle_orm.Relations<"event_shares", {
|
|
|
1095
1095
|
*
|
|
1096
1096
|
* 使用方式:
|
|
1097
1097
|
* ```typescript
|
|
1098
|
-
* import { calendarDbService } from '
|
|
1099
|
-
* ```
|
|
1100
|
-
*
|
|
1101
|
-
* 对于 API 路由处理器,请使用:
|
|
1102
|
-
* ```typescript
|
|
1103
|
-
* import { createGetEventsHandler } from '@qhr123/sa2kit/calendar/routes';
|
|
1098
|
+
* import { calendarDbService } from 'sa2kit/calendar/server';
|
|
1104
1099
|
* ```
|
|
1105
1100
|
*
|
|
1106
1101
|
* @version 1.0.0
|
|
@@ -1184,6 +1179,6 @@ declare function createSuccessResponse(data: any, message?: string): Response;
|
|
|
1184
1179
|
*/
|
|
1185
1180
|
declare function checkEventPermission(eventId: number, userId: number, requiredPermission?: 'read' | 'write'): Promise<boolean>;
|
|
1186
1181
|
declare const CALENDAR_SERVER_MODULE_VERSION = "1.0.0";
|
|
1187
|
-
declare const CALENDAR_SERVER_MODULE_NAME = "
|
|
1182
|
+
declare const CALENDAR_SERVER_MODULE_NAME = "sa2kit/calendar/server";
|
|
1188
1183
|
|
|
1189
1184
|
export { CALENDAR_SERVER_MODULE_NAME, CALENDAR_SERVER_MODULE_VERSION, DEFAULT_CALENDAR_CONFIG, calculateReminderTime, calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, checkEventPermission, createErrorResponse, createSuccessResponse, eventShares, eventSharesRelations, generateRecurrenceInstances, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations, validateEventData, validateRecurrenceData };
|
package/dist/calendar/server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkAXP7KROR_js = require('../chunk-AXP7KROR.js');
|
|
4
4
|
require('../chunk-SVWQN2LR.js');
|
|
5
5
|
require('../chunk-DGUM43GV.js');
|
|
6
6
|
|
|
@@ -150,7 +150,7 @@ function createSuccessResponse(data, message) {
|
|
|
150
150
|
}
|
|
151
151
|
async function checkEventPermission(eventId, userId, requiredPermission = "read") {
|
|
152
152
|
try {
|
|
153
|
-
const event = await
|
|
153
|
+
const event = await chunkAXP7KROR_js.calendarDbService.getEventById(eventId);
|
|
154
154
|
if (!event) return false;
|
|
155
155
|
return event.userId === userId;
|
|
156
156
|
} catch (error) {
|
|
@@ -159,51 +159,51 @@ async function checkEventPermission(eventId, userId, requiredPermission = "read"
|
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
var CALENDAR_SERVER_MODULE_VERSION = "1.0.0";
|
|
162
|
-
var CALENDAR_SERVER_MODULE_NAME = "
|
|
162
|
+
var CALENDAR_SERVER_MODULE_NAME = "sa2kit/calendar/server";
|
|
163
163
|
|
|
164
164
|
Object.defineProperty(exports, "calendarConfigs", {
|
|
165
165
|
enumerable: true,
|
|
166
|
-
get: function () { return
|
|
166
|
+
get: function () { return chunkAXP7KROR_js.calendarConfigs; }
|
|
167
167
|
});
|
|
168
168
|
Object.defineProperty(exports, "calendarConfigsRelations", {
|
|
169
169
|
enumerable: true,
|
|
170
|
-
get: function () { return
|
|
170
|
+
get: function () { return chunkAXP7KROR_js.calendarConfigsRelations; }
|
|
171
171
|
});
|
|
172
172
|
Object.defineProperty(exports, "calendarDbService", {
|
|
173
173
|
enumerable: true,
|
|
174
|
-
get: function () { return
|
|
174
|
+
get: function () { return chunkAXP7KROR_js.calendarDbService; }
|
|
175
175
|
});
|
|
176
176
|
Object.defineProperty(exports, "calendarEvents", {
|
|
177
177
|
enumerable: true,
|
|
178
|
-
get: function () { return
|
|
178
|
+
get: function () { return chunkAXP7KROR_js.calendarEvents; }
|
|
179
179
|
});
|
|
180
180
|
Object.defineProperty(exports, "calendarEventsRelations", {
|
|
181
181
|
enumerable: true,
|
|
182
|
-
get: function () { return
|
|
182
|
+
get: function () { return chunkAXP7KROR_js.calendarEventsRelations; }
|
|
183
183
|
});
|
|
184
184
|
Object.defineProperty(exports, "eventShares", {
|
|
185
185
|
enumerable: true,
|
|
186
|
-
get: function () { return
|
|
186
|
+
get: function () { return chunkAXP7KROR_js.eventShares; }
|
|
187
187
|
});
|
|
188
188
|
Object.defineProperty(exports, "eventSharesRelations", {
|
|
189
189
|
enumerable: true,
|
|
190
|
-
get: function () { return
|
|
190
|
+
get: function () { return chunkAXP7KROR_js.eventSharesRelations; }
|
|
191
191
|
});
|
|
192
192
|
Object.defineProperty(exports, "recurrenceRules", {
|
|
193
193
|
enumerable: true,
|
|
194
|
-
get: function () { return
|
|
194
|
+
get: function () { return chunkAXP7KROR_js.recurrenceRules; }
|
|
195
195
|
});
|
|
196
196
|
Object.defineProperty(exports, "recurrenceRulesRelations", {
|
|
197
197
|
enumerable: true,
|
|
198
|
-
get: function () { return
|
|
198
|
+
get: function () { return chunkAXP7KROR_js.recurrenceRulesRelations; }
|
|
199
199
|
});
|
|
200
200
|
Object.defineProperty(exports, "reminders", {
|
|
201
201
|
enumerable: true,
|
|
202
|
-
get: function () { return
|
|
202
|
+
get: function () { return chunkAXP7KROR_js.reminders; }
|
|
203
203
|
});
|
|
204
204
|
Object.defineProperty(exports, "remindersRelations", {
|
|
205
205
|
enumerable: true,
|
|
206
|
-
get: function () { return
|
|
206
|
+
get: function () { return chunkAXP7KROR_js.remindersRelations; }
|
|
207
207
|
});
|
|
208
208
|
exports.CALENDAR_SERVER_MODULE_NAME = CALENDAR_SERVER_MODULE_NAME;
|
|
209
209
|
exports.CALENDAR_SERVER_MODULE_VERSION = CALENDAR_SERVER_MODULE_VERSION;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/calendar/server.ts"],"names":["calendarDbService"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * Calendar 模块 - 服务端专用导出\n * \n * 这个文件包含只能在服务端使用的功能,包括:\n * - 数据库服务层\n * - 服务端配置和工具\n * - API处理函数\n * \n * 注意:这些导出只能在服务端环境中使用,不要在客户端组件中导入!\n * \n * 使用方式:\n * ```typescript\n * import { calendarDbService } from '@qhr123/sa2kit/calendar/server';\n * ```\n * \n * 对于 API 路由处理器,请使用:\n * ```typescript\n * import { createGetEventsHandler } from '@qhr123/sa2kit/calendar/routes';\n * ```\n * \n * @version 1.0.0\n * @author Profile-v1 Team\n */\n\n// ===== 数据库服务导出 =====\n/**\n * 日历数据库服务\n * \n * 提供所有与日历相关的数据库操作,包括:\n * - 事件的CRUD操作\n * - 重复规则管理\n * - 提醒管理\n * - 用户配置管理\n * - 事件分享功能\n */\nimport { calendarDbService } from './db/calendarDbService';\nexport { calendarDbService };\n\n// ===== 数据库Schema导出 =====\n/**\n * 数据库表结构和关系定义\n * \n * 用于数据库迁移、类型定义和关系查询\n */\nexport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares,\n calendarEventsRelations,\n recurrenceRulesRelations,\n remindersRelations,\n calendarConfigsRelations,\n eventSharesRelations,\n} from './db/schema';\n\n// ===== 服务端工具函数 =====\n/**\n * 服务端专用的工具函数和常量\n */\n\n/**\n * 默认日历配置\n */\nexport const DEFAULT_CALENDAR_CONFIG = {\n firstDayOfWeek: 1, // 周一开始\n workingHours: {\n start: '09:00',\n end: '18:00'\n },\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month' as const,\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {\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};\n\n/**\n * 验证事件数据的服务端函数\n */\nexport function validateEventData(eventData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证必需字段\n if (!eventData.title || typeof eventData.title !== 'string' || eventData.title.trim() === '') {\n errors.push('事件标题不能为空');\n }\n\n if (!eventData.startTime) {\n errors.push('开始时间不能为空');\n }\n\n if (!eventData.endTime) {\n errors.push('结束时间不能为空');\n }\n\n // 验证时间逻辑\n if (eventData.startTime && eventData.endTime) {\n const startTime = new Date(eventData.startTime);\n const endTime = new Date(eventData.endTime);\n\n if (isNaN(startTime.getTime())) {\n errors.push('开始时间格式无效');\n }\n\n if (isNaN(endTime.getTime())) {\n errors.push('结束时间格式无效');\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n errors.push('结束时间必须晚于开始时间');\n }\n }\n\n // 验证颜色格式\n if (eventData.color && !/^#[0-9A-Fa-f]{6}$/.test(eventData.color)) {\n errors.push('颜色格式无效,请使用十六进制格式(如 #FF0000)');\n }\n\n // 验证用户ID\n if (!eventData.userId || typeof eventData.userId !== 'number' || eventData.userId <= 0) {\n errors.push('用户ID无效');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 验证重复规则数据\n */\nexport function validateRecurrenceData(recurrenceData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!recurrenceData.ruleType) {\n errors.push('重复类型不能为空');\n }\n\n const validRuleTypes = ['daily', 'weekly', 'monthly', 'yearly', 'custom'];\n if (recurrenceData.ruleType && !validRuleTypes.includes(recurrenceData.ruleType)) {\n errors.push('重复类型无效');\n }\n\n if (!recurrenceData.interval || recurrenceData.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n // 验证结束条件\n if (recurrenceData.endDate && recurrenceData.count) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (recurrenceData.endDate) {\n const endDate = new Date(recurrenceData.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式无效');\n }\n }\n\n if (recurrenceData.count && (recurrenceData.count < 1 || recurrenceData.count > 1000)) {\n errors.push('重复次数必须在1-1000之间');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 生成重复事件的服务端函数\n */\nexport function generateRecurrenceInstances(\n baseEvent: any,\n recurrenceRule: any,\n maxInstances: number = 100\n): Array<{ startTime: Date; endTime: Date }> {\n const instances: Array<{ startTime: Date; endTime: Date }> = [];\n const startTime = new Date(baseEvent.startTime);\n const endTime = new Date(baseEvent.endTime);\n const duration = endTime.getTime() - startTime.getTime();\n\n let currentDate = new Date(startTime);\n let count = 0;\n\n const endDate = recurrenceRule.endDate ? new Date(recurrenceRule.endDate) : null;\n const maxCount = recurrenceRule.count || maxInstances;\n\n while (count < maxCount) {\n // 检查是否超过结束日期\n if (endDate && currentDate > endDate) {\n break;\n }\n\n // 添加实例\n instances.push({\n startTime: new Date(currentDate),\n endTime: new Date(currentDate.getTime() + duration)\n });\n\n count++;\n\n // 计算下一个实例的日期\n switch (recurrenceRule.ruleType) {\n case 'daily':\n currentDate.setDate(currentDate.getDate() + recurrenceRule.interval);\n break;\n case 'weekly':\n currentDate.setDate(currentDate.getDate() + (7 * recurrenceRule.interval));\n break;\n case 'monthly':\n currentDate.setMonth(currentDate.getMonth() + recurrenceRule.interval);\n break;\n case 'yearly':\n currentDate.setFullYear(currentDate.getFullYear() + recurrenceRule.interval);\n break;\n default:\n // 对于自定义规则,需要更复杂的逻辑\n break;\n }\n }\n\n return instances;\n}\n\n/**\n * 获取提醒发送时间\n */\nexport function calculateReminderTime(eventStartTime: Date, reminderOffset: number): Date {\n return new Date(eventStartTime.getTime() - reminderOffset);\n}\n\n/**\n * 格式化错误响应\n */\nexport function createErrorResponse(message: string, errors?: string[]): Response {\n return Response.json(\n {\n success: false,\n error: message,\n errors: errors\n },\n { status: 400 }\n );\n}\n\n/**\n * 格式化成功响应\n */\nexport function createSuccessResponse(data: any, message?: string): Response {\n return Response.json({\n success: true,\n data,\n message\n });\n}\n\n/**\n * 检查用户是否有权限访问事件\n */\nexport async function checkEventPermission(\n eventId: number,\n userId: number,\n requiredPermission: 'read' | 'write' = 'read'\n): Promise<boolean> {\n try {\n // 检查是否是事件创建者\n const event = await calendarDbService.getEventById(eventId);\n if (!event) return false;\n \n // 目前只允许事件创建者访问\n return event.userId === userId;\n } catch (error) {\n console.error('检查事件权限时出错:', error);\n return false;\n }\n}\n\n// ===== 模块信息 =====\nexport const CALENDAR_SERVER_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_SERVER_MODULE_NAME = '@qhr123/sa2kit/calendar/server'; "]}
|
|
1
|
+
{"version":3,"sources":["../../src/calendar/server.ts"],"names":["calendarDbService"],"mappings":"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","file":"server.js","sourcesContent":["/**\n * Calendar 模块 - 服务端专用导出\n * \n * 这个文件包含只能在服务端使用的功能,包括:\n * - 数据库服务层\n * - 服务端配置和工具\n * - API处理函数\n * \n * 注意:这些导出只能在服务端环境中使用,不要在客户端组件中导入!\n * \n * 使用方式:\n * ```typescript\n * import { calendarDbService } from 'sa2kit/calendar/server';\n * ```\n * \n * @version 1.0.0\n * @author Profile-v1 Team\n */\n\n// ===== 数据库服务导出 =====\n/**\n * 日历数据库服务\n * \n * 提供所有与日历相关的数据库操作,包括:\n * - 事件的CRUD操作\n * - 重复规则管理\n * - 提醒管理\n * - 用户配置管理\n * - 事件分享功能\n */\nimport { calendarDbService } from './db/calendarDbService';\nexport { calendarDbService };\n\n// ===== 数据库Schema导出 =====\n/**\n * 数据库表结构和关系定义\n * \n * 用于数据库迁移、类型定义和关系查询\n */\nexport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares,\n calendarEventsRelations,\n recurrenceRulesRelations,\n remindersRelations,\n calendarConfigsRelations,\n eventSharesRelations,\n} from './db/schema';\n\n// ===== 服务端工具函数 =====\n/**\n * 服务端专用的工具函数和常量\n */\n\n/**\n * 默认日历配置\n */\nexport const DEFAULT_CALENDAR_CONFIG = {\n firstDayOfWeek: 1, // 周一开始\n workingHours: {\n start: '09:00',\n end: '18:00'\n },\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month' as const,\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {\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};\n\n/**\n * 验证事件数据的服务端函数\n */\nexport function validateEventData(eventData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证必需字段\n if (!eventData.title || typeof eventData.title !== 'string' || eventData.title.trim() === '') {\n errors.push('事件标题不能为空');\n }\n\n if (!eventData.startTime) {\n errors.push('开始时间不能为空');\n }\n\n if (!eventData.endTime) {\n errors.push('结束时间不能为空');\n }\n\n // 验证时间逻辑\n if (eventData.startTime && eventData.endTime) {\n const startTime = new Date(eventData.startTime);\n const endTime = new Date(eventData.endTime);\n\n if (isNaN(startTime.getTime())) {\n errors.push('开始时间格式无效');\n }\n\n if (isNaN(endTime.getTime())) {\n errors.push('结束时间格式无效');\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n errors.push('结束时间必须晚于开始时间');\n }\n }\n\n // 验证颜色格式\n if (eventData.color && !/^#[0-9A-Fa-f]{6}$/.test(eventData.color)) {\n errors.push('颜色格式无效,请使用十六进制格式(如 #FF0000)');\n }\n\n // 验证用户ID\n if (!eventData.userId || typeof eventData.userId !== 'number' || eventData.userId <= 0) {\n errors.push('用户ID无效');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 验证重复规则数据\n */\nexport function validateRecurrenceData(recurrenceData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!recurrenceData.ruleType) {\n errors.push('重复类型不能为空');\n }\n\n const validRuleTypes = ['daily', 'weekly', 'monthly', 'yearly', 'custom'];\n if (recurrenceData.ruleType && !validRuleTypes.includes(recurrenceData.ruleType)) {\n errors.push('重复类型无效');\n }\n\n if (!recurrenceData.interval || recurrenceData.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n // 验证结束条件\n if (recurrenceData.endDate && recurrenceData.count) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (recurrenceData.endDate) {\n const endDate = new Date(recurrenceData.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式无效');\n }\n }\n\n if (recurrenceData.count && (recurrenceData.count < 1 || recurrenceData.count > 1000)) {\n errors.push('重复次数必须在1-1000之间');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 生成重复事件的服务端函数\n */\nexport function generateRecurrenceInstances(\n baseEvent: any,\n recurrenceRule: any,\n maxInstances: number = 100\n): Array<{ startTime: Date; endTime: Date }> {\n const instances: Array<{ startTime: Date; endTime: Date }> = [];\n const startTime = new Date(baseEvent.startTime);\n const endTime = new Date(baseEvent.endTime);\n const duration = endTime.getTime() - startTime.getTime();\n\n let currentDate = new Date(startTime);\n let count = 0;\n\n const endDate = recurrenceRule.endDate ? new Date(recurrenceRule.endDate) : null;\n const maxCount = recurrenceRule.count || maxInstances;\n\n while (count < maxCount) {\n // 检查是否超过结束日期\n if (endDate && currentDate > endDate) {\n break;\n }\n\n // 添加实例\n instances.push({\n startTime: new Date(currentDate),\n endTime: new Date(currentDate.getTime() + duration)\n });\n\n count++;\n\n // 计算下一个实例的日期\n switch (recurrenceRule.ruleType) {\n case 'daily':\n currentDate.setDate(currentDate.getDate() + recurrenceRule.interval);\n break;\n case 'weekly':\n currentDate.setDate(currentDate.getDate() + (7 * recurrenceRule.interval));\n break;\n case 'monthly':\n currentDate.setMonth(currentDate.getMonth() + recurrenceRule.interval);\n break;\n case 'yearly':\n currentDate.setFullYear(currentDate.getFullYear() + recurrenceRule.interval);\n break;\n default:\n // 对于自定义规则,需要更复杂的逻辑\n break;\n }\n }\n\n return instances;\n}\n\n/**\n * 获取提醒发送时间\n */\nexport function calculateReminderTime(eventStartTime: Date, reminderOffset: number): Date {\n return new Date(eventStartTime.getTime() - reminderOffset);\n}\n\n/**\n * 格式化错误响应\n */\nexport function createErrorResponse(message: string, errors?: string[]): Response {\n return Response.json(\n {\n success: false,\n error: message,\n errors: errors\n },\n { status: 400 }\n );\n}\n\n/**\n * 格式化成功响应\n */\nexport function createSuccessResponse(data: any, message?: string): Response {\n return Response.json({\n success: true,\n data,\n message\n });\n}\n\n/**\n * 检查用户是否有权限访问事件\n */\nexport async function checkEventPermission(\n eventId: number,\n userId: number,\n requiredPermission: 'read' | 'write' = 'read'\n): Promise<boolean> {\n try {\n // 检查是否是事件创建者\n const event = await calendarDbService.getEventById(eventId);\n if (!event) return false;\n \n // 目前只允许事件创建者访问\n return event.userId === userId;\n } catch (error) {\n console.error('检查事件权限时出错:', error);\n return false;\n }\n}\n\n// ===== 模块信息 =====\nexport const CALENDAR_SERVER_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_SERVER_MODULE_NAME = 'sa2kit/calendar/server'; "]}
|
package/dist/calendar/server.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { calendarDbService } from '../chunk-
|
|
2
|
-
export { calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, eventShares, eventSharesRelations, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations } from '../chunk-
|
|
1
|
+
import { calendarDbService } from '../chunk-6WXOA4BE.mjs';
|
|
2
|
+
export { calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, eventShares, eventSharesRelations, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations } from '../chunk-6WXOA4BE.mjs';
|
|
3
3
|
import '../chunk-AIKEVVDR.mjs';
|
|
4
4
|
import '../chunk-BJTO5JO5.mjs';
|
|
5
5
|
|
|
@@ -158,7 +158,7 @@ async function checkEventPermission(eventId, userId, requiredPermission = "read"
|
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
var CALENDAR_SERVER_MODULE_VERSION = "1.0.0";
|
|
161
|
-
var CALENDAR_SERVER_MODULE_NAME = "
|
|
161
|
+
var CALENDAR_SERVER_MODULE_NAME = "sa2kit/calendar/server";
|
|
162
162
|
|
|
163
163
|
export { CALENDAR_SERVER_MODULE_NAME, CALENDAR_SERVER_MODULE_VERSION, DEFAULT_CALENDAR_CONFIG, calculateReminderTime, checkEventPermission, createErrorResponse, createSuccessResponse, generateRecurrenceInstances, validateEventData, validateRecurrenceData };
|
|
164
164
|
//# sourceMappingURL=server.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/calendar/server.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * Calendar 模块 - 服务端专用导出\n * \n * 这个文件包含只能在服务端使用的功能,包括:\n * - 数据库服务层\n * - 服务端配置和工具\n * - API处理函数\n * \n * 注意:这些导出只能在服务端环境中使用,不要在客户端组件中导入!\n * \n * 使用方式:\n * ```typescript\n * import { calendarDbService } from '@qhr123/sa2kit/calendar/server';\n * ```\n * \n * 对于 API 路由处理器,请使用:\n * ```typescript\n * import { createGetEventsHandler } from '@qhr123/sa2kit/calendar/routes';\n * ```\n * \n * @version 1.0.0\n * @author Profile-v1 Team\n */\n\n// ===== 数据库服务导出 =====\n/**\n * 日历数据库服务\n * \n * 提供所有与日历相关的数据库操作,包括:\n * - 事件的CRUD操作\n * - 重复规则管理\n * - 提醒管理\n * - 用户配置管理\n * - 事件分享功能\n */\nimport { calendarDbService } from './db/calendarDbService';\nexport { calendarDbService };\n\n// ===== 数据库Schema导出 =====\n/**\n * 数据库表结构和关系定义\n * \n * 用于数据库迁移、类型定义和关系查询\n */\nexport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares,\n calendarEventsRelations,\n recurrenceRulesRelations,\n remindersRelations,\n calendarConfigsRelations,\n eventSharesRelations,\n} from './db/schema';\n\n// ===== 服务端工具函数 =====\n/**\n * 服务端专用的工具函数和常量\n */\n\n/**\n * 默认日历配置\n */\nexport const DEFAULT_CALENDAR_CONFIG = {\n firstDayOfWeek: 1, // 周一开始\n workingHours: {\n start: '09:00',\n end: '18:00'\n },\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month' as const,\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {\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};\n\n/**\n * 验证事件数据的服务端函数\n */\nexport function validateEventData(eventData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证必需字段\n if (!eventData.title || typeof eventData.title !== 'string' || eventData.title.trim() === '') {\n errors.push('事件标题不能为空');\n }\n\n if (!eventData.startTime) {\n errors.push('开始时间不能为空');\n }\n\n if (!eventData.endTime) {\n errors.push('结束时间不能为空');\n }\n\n // 验证时间逻辑\n if (eventData.startTime && eventData.endTime) {\n const startTime = new Date(eventData.startTime);\n const endTime = new Date(eventData.endTime);\n\n if (isNaN(startTime.getTime())) {\n errors.push('开始时间格式无效');\n }\n\n if (isNaN(endTime.getTime())) {\n errors.push('结束时间格式无效');\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n errors.push('结束时间必须晚于开始时间');\n }\n }\n\n // 验证颜色格式\n if (eventData.color && !/^#[0-9A-Fa-f]{6}$/.test(eventData.color)) {\n errors.push('颜色格式无效,请使用十六进制格式(如 #FF0000)');\n }\n\n // 验证用户ID\n if (!eventData.userId || typeof eventData.userId !== 'number' || eventData.userId <= 0) {\n errors.push('用户ID无效');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 验证重复规则数据\n */\nexport function validateRecurrenceData(recurrenceData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!recurrenceData.ruleType) {\n errors.push('重复类型不能为空');\n }\n\n const validRuleTypes = ['daily', 'weekly', 'monthly', 'yearly', 'custom'];\n if (recurrenceData.ruleType && !validRuleTypes.includes(recurrenceData.ruleType)) {\n errors.push('重复类型无效');\n }\n\n if (!recurrenceData.interval || recurrenceData.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n // 验证结束条件\n if (recurrenceData.endDate && recurrenceData.count) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (recurrenceData.endDate) {\n const endDate = new Date(recurrenceData.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式无效');\n }\n }\n\n if (recurrenceData.count && (recurrenceData.count < 1 || recurrenceData.count > 1000)) {\n errors.push('重复次数必须在1-1000之间');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 生成重复事件的服务端函数\n */\nexport function generateRecurrenceInstances(\n baseEvent: any,\n recurrenceRule: any,\n maxInstances: number = 100\n): Array<{ startTime: Date; endTime: Date }> {\n const instances: Array<{ startTime: Date; endTime: Date }> = [];\n const startTime = new Date(baseEvent.startTime);\n const endTime = new Date(baseEvent.endTime);\n const duration = endTime.getTime() - startTime.getTime();\n\n let currentDate = new Date(startTime);\n let count = 0;\n\n const endDate = recurrenceRule.endDate ? new Date(recurrenceRule.endDate) : null;\n const maxCount = recurrenceRule.count || maxInstances;\n\n while (count < maxCount) {\n // 检查是否超过结束日期\n if (endDate && currentDate > endDate) {\n break;\n }\n\n // 添加实例\n instances.push({\n startTime: new Date(currentDate),\n endTime: new Date(currentDate.getTime() + duration)\n });\n\n count++;\n\n // 计算下一个实例的日期\n switch (recurrenceRule.ruleType) {\n case 'daily':\n currentDate.setDate(currentDate.getDate() + recurrenceRule.interval);\n break;\n case 'weekly':\n currentDate.setDate(currentDate.getDate() + (7 * recurrenceRule.interval));\n break;\n case 'monthly':\n currentDate.setMonth(currentDate.getMonth() + recurrenceRule.interval);\n break;\n case 'yearly':\n currentDate.setFullYear(currentDate.getFullYear() + recurrenceRule.interval);\n break;\n default:\n // 对于自定义规则,需要更复杂的逻辑\n break;\n }\n }\n\n return instances;\n}\n\n/**\n * 获取提醒发送时间\n */\nexport function calculateReminderTime(eventStartTime: Date, reminderOffset: number): Date {\n return new Date(eventStartTime.getTime() - reminderOffset);\n}\n\n/**\n * 格式化错误响应\n */\nexport function createErrorResponse(message: string, errors?: string[]): Response {\n return Response.json(\n {\n success: false,\n error: message,\n errors: errors\n },\n { status: 400 }\n );\n}\n\n/**\n * 格式化成功响应\n */\nexport function createSuccessResponse(data: any, message?: string): Response {\n return Response.json({\n success: true,\n data,\n message\n });\n}\n\n/**\n * 检查用户是否有权限访问事件\n */\nexport async function checkEventPermission(\n eventId: number,\n userId: number,\n requiredPermission: 'read' | 'write' = 'read'\n): Promise<boolean> {\n try {\n // 检查是否是事件创建者\n const event = await calendarDbService.getEventById(eventId);\n if (!event) return false;\n \n // 目前只允许事件创建者访问\n return event.userId === userId;\n } catch (error) {\n console.error('检查事件权限时出错:', error);\n return false;\n }\n}\n\n// ===== 模块信息 =====\nexport const CALENDAR_SERVER_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_SERVER_MODULE_NAME = '@qhr123/sa2kit/calendar/server'; "]}
|
|
1
|
+
{"version":3,"sources":["../../src/calendar/server.ts"],"names":[],"mappings":"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","file":"server.mjs","sourcesContent":["/**\n * Calendar 模块 - 服务端专用导出\n * \n * 这个文件包含只能在服务端使用的功能,包括:\n * - 数据库服务层\n * - 服务端配置和工具\n * - API处理函数\n * \n * 注意:这些导出只能在服务端环境中使用,不要在客户端组件中导入!\n * \n * 使用方式:\n * ```typescript\n * import { calendarDbService } from 'sa2kit/calendar/server';\n * ```\n * \n * @version 1.0.0\n * @author Profile-v1 Team\n */\n\n// ===== 数据库服务导出 =====\n/**\n * 日历数据库服务\n * \n * 提供所有与日历相关的数据库操作,包括:\n * - 事件的CRUD操作\n * - 重复规则管理\n * - 提醒管理\n * - 用户配置管理\n * - 事件分享功能\n */\nimport { calendarDbService } from './db/calendarDbService';\nexport { calendarDbService };\n\n// ===== 数据库Schema导出 =====\n/**\n * 数据库表结构和关系定义\n * \n * 用于数据库迁移、类型定义和关系查询\n */\nexport {\n calendarEvents,\n recurrenceRules,\n reminders,\n calendarConfigs,\n eventShares,\n calendarEventsRelations,\n recurrenceRulesRelations,\n remindersRelations,\n calendarConfigsRelations,\n eventSharesRelations,\n} from './db/schema';\n\n// ===== 服务端工具函数 =====\n/**\n * 服务端专用的工具函数和常量\n */\n\n/**\n * 默认日历配置\n */\nexport const DEFAULT_CALENDAR_CONFIG = {\n firstDayOfWeek: 1, // 周一开始\n workingHours: {\n start: '09:00',\n end: '18:00'\n },\n timeZone: 'Asia/Shanghai',\n dateFormat: 'YYYY-MM-DD',\n timeFormat: 'HH:mm',\n defaultView: 'month' as const,\n defaultEventColor: '#3B82F6',\n weekends: true,\n eventColors: {\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};\n\n/**\n * 验证事件数据的服务端函数\n */\nexport function validateEventData(eventData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // 验证必需字段\n if (!eventData.title || typeof eventData.title !== 'string' || eventData.title.trim() === '') {\n errors.push('事件标题不能为空');\n }\n\n if (!eventData.startTime) {\n errors.push('开始时间不能为空');\n }\n\n if (!eventData.endTime) {\n errors.push('结束时间不能为空');\n }\n\n // 验证时间逻辑\n if (eventData.startTime && eventData.endTime) {\n const startTime = new Date(eventData.startTime);\n const endTime = new Date(eventData.endTime);\n\n if (isNaN(startTime.getTime())) {\n errors.push('开始时间格式无效');\n }\n\n if (isNaN(endTime.getTime())) {\n errors.push('结束时间格式无效');\n }\n\n if (startTime.getTime() >= endTime.getTime()) {\n errors.push('结束时间必须晚于开始时间');\n }\n }\n\n // 验证颜色格式\n if (eventData.color && !/^#[0-9A-Fa-f]{6}$/.test(eventData.color)) {\n errors.push('颜色格式无效,请使用十六进制格式(如 #FF0000)');\n }\n\n // 验证用户ID\n if (!eventData.userId || typeof eventData.userId !== 'number' || eventData.userId <= 0) {\n errors.push('用户ID无效');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 验证重复规则数据\n */\nexport function validateRecurrenceData(recurrenceData: any): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (!recurrenceData.ruleType) {\n errors.push('重复类型不能为空');\n }\n\n const validRuleTypes = ['daily', 'weekly', 'monthly', 'yearly', 'custom'];\n if (recurrenceData.ruleType && !validRuleTypes.includes(recurrenceData.ruleType)) {\n errors.push('重复类型无效');\n }\n\n if (!recurrenceData.interval || recurrenceData.interval < 1) {\n errors.push('重复间隔必须大于0');\n }\n\n // 验证结束条件\n if (recurrenceData.endDate && recurrenceData.count) {\n errors.push('不能同时设置结束日期和重复次数');\n }\n\n if (recurrenceData.endDate) {\n const endDate = new Date(recurrenceData.endDate);\n if (isNaN(endDate.getTime())) {\n errors.push('结束日期格式无效');\n }\n }\n\n if (recurrenceData.count && (recurrenceData.count < 1 || recurrenceData.count > 1000)) {\n errors.push('重复次数必须在1-1000之间');\n }\n\n return {\n valid: errors.length === 0,\n errors\n };\n}\n\n/**\n * 生成重复事件的服务端函数\n */\nexport function generateRecurrenceInstances(\n baseEvent: any,\n recurrenceRule: any,\n maxInstances: number = 100\n): Array<{ startTime: Date; endTime: Date }> {\n const instances: Array<{ startTime: Date; endTime: Date }> = [];\n const startTime = new Date(baseEvent.startTime);\n const endTime = new Date(baseEvent.endTime);\n const duration = endTime.getTime() - startTime.getTime();\n\n let currentDate = new Date(startTime);\n let count = 0;\n\n const endDate = recurrenceRule.endDate ? new Date(recurrenceRule.endDate) : null;\n const maxCount = recurrenceRule.count || maxInstances;\n\n while (count < maxCount) {\n // 检查是否超过结束日期\n if (endDate && currentDate > endDate) {\n break;\n }\n\n // 添加实例\n instances.push({\n startTime: new Date(currentDate),\n endTime: new Date(currentDate.getTime() + duration)\n });\n\n count++;\n\n // 计算下一个实例的日期\n switch (recurrenceRule.ruleType) {\n case 'daily':\n currentDate.setDate(currentDate.getDate() + recurrenceRule.interval);\n break;\n case 'weekly':\n currentDate.setDate(currentDate.getDate() + (7 * recurrenceRule.interval));\n break;\n case 'monthly':\n currentDate.setMonth(currentDate.getMonth() + recurrenceRule.interval);\n break;\n case 'yearly':\n currentDate.setFullYear(currentDate.getFullYear() + recurrenceRule.interval);\n break;\n default:\n // 对于自定义规则,需要更复杂的逻辑\n break;\n }\n }\n\n return instances;\n}\n\n/**\n * 获取提醒发送时间\n */\nexport function calculateReminderTime(eventStartTime: Date, reminderOffset: number): Date {\n return new Date(eventStartTime.getTime() - reminderOffset);\n}\n\n/**\n * 格式化错误响应\n */\nexport function createErrorResponse(message: string, errors?: string[]): Response {\n return Response.json(\n {\n success: false,\n error: message,\n errors: errors\n },\n { status: 400 }\n );\n}\n\n/**\n * 格式化成功响应\n */\nexport function createSuccessResponse(data: any, message?: string): Response {\n return Response.json({\n success: true,\n data,\n message\n });\n}\n\n/**\n * 检查用户是否有权限访问事件\n */\nexport async function checkEventPermission(\n eventId: number,\n userId: number,\n requiredPermission: 'read' | 'write' = 'read'\n): Promise<boolean> {\n try {\n // 检查是否是事件创建者\n const event = await calendarDbService.getEventById(eventId);\n if (!event) return false;\n \n // 目前只允许事件创建者访问\n return event.userId === userId;\n } catch (error) {\n console.error('检查事件权限时出错:', error);\n return false;\n }\n}\n\n// ===== 模块信息 =====\nexport const CALENDAR_SERVER_MODULE_VERSION = '1.0.0';\nexport const CALENDAR_SERVER_MODULE_NAME = 'sa2kit/calendar/server'; "]}
|
|
@@ -141,7 +141,7 @@ var CalendarDbService = class {
|
|
|
141
141
|
*/
|
|
142
142
|
get db() {
|
|
143
143
|
if (!this._db) {
|
|
144
|
-
throw new Error("CalendarDbService: Database instance not set. Call setDb(
|
|
144
|
+
throw new Error("CalendarDbService: Database instance not set. Call setDb() first.");
|
|
145
145
|
}
|
|
146
146
|
return this._db;
|
|
147
147
|
}
|
|
@@ -218,7 +218,6 @@ var CalendarDbService = class {
|
|
|
218
218
|
return newConfig;
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
|
-
// ===== 重复规则基础操作 =====
|
|
222
221
|
/**
|
|
223
222
|
* 为事件创建重复规则
|
|
224
223
|
*/
|
|
@@ -239,7 +238,6 @@ var CalendarDbService = class {
|
|
|
239
238
|
async deleteRecurrenceRule(eventId) {
|
|
240
239
|
await this.db.delete(recurrenceRules).where(eq(recurrenceRules.eventId, eventId));
|
|
241
240
|
}
|
|
242
|
-
// ===== 提醒基础操作 =====
|
|
243
241
|
/**
|
|
244
242
|
* 为事件创建提醒
|
|
245
243
|
*/
|
|
@@ -263,7 +261,6 @@ var CalendarDbService = class {
|
|
|
263
261
|
async deleteEventReminders(eventId) {
|
|
264
262
|
await this.db.delete(reminders).where(eq(reminders.eventId, eventId));
|
|
265
263
|
}
|
|
266
|
-
// ===== 统计和查询 =====
|
|
267
264
|
/**
|
|
268
265
|
* 获取用户在指定时间范围内的事件数量
|
|
269
266
|
*/
|
|
@@ -285,7 +282,6 @@ var CalendarDbService = class {
|
|
|
285
282
|
const events = await this.db.select().from(calendarEvents).where(
|
|
286
283
|
and(
|
|
287
284
|
eq(calendarEvents.userId, userId)
|
|
288
|
-
// 使用 ILIKE 进行不区分大小写的搜索
|
|
289
285
|
)
|
|
290
286
|
).orderBy(desc(calendarEvents.startTime));
|
|
291
287
|
return events.filter(
|
|
@@ -302,5 +298,5 @@ var CalendarDbService = class {
|
|
|
302
298
|
var calendarDbService = new CalendarDbService();
|
|
303
299
|
|
|
304
300
|
export { calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, eventShares, eventSharesRelations, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations };
|
|
305
|
-
//# sourceMappingURL=chunk-
|
|
306
|
-
//# sourceMappingURL=chunk-
|
|
301
|
+
//# sourceMappingURL=chunk-6WXOA4BE.mjs.map
|
|
302
|
+
//# sourceMappingURL=chunk-6WXOA4BE.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/calendar/db/schema.ts","../src/calendar/db/calendarDbService.ts"],"names":[],"mappings":"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","file":"chunk-6WXOA4BE.mjs","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; "]}
|
|
@@ -143,7 +143,7 @@ var CalendarDbService = class {
|
|
|
143
143
|
*/
|
|
144
144
|
get db() {
|
|
145
145
|
if (!this._db) {
|
|
146
|
-
throw new Error("CalendarDbService: Database instance not set. Call setDb(
|
|
146
|
+
throw new Error("CalendarDbService: Database instance not set. Call setDb() first.");
|
|
147
147
|
}
|
|
148
148
|
return this._db;
|
|
149
149
|
}
|
|
@@ -220,7 +220,6 @@ var CalendarDbService = class {
|
|
|
220
220
|
return newConfig;
|
|
221
221
|
}
|
|
222
222
|
}
|
|
223
|
-
// ===== 重复规则基础操作 =====
|
|
224
223
|
/**
|
|
225
224
|
* 为事件创建重复规则
|
|
226
225
|
*/
|
|
@@ -241,7 +240,6 @@ var CalendarDbService = class {
|
|
|
241
240
|
async deleteRecurrenceRule(eventId) {
|
|
242
241
|
await this.db.delete(recurrenceRules).where(drizzleOrm.eq(recurrenceRules.eventId, eventId));
|
|
243
242
|
}
|
|
244
|
-
// ===== 提醒基础操作 =====
|
|
245
243
|
/**
|
|
246
244
|
* 为事件创建提醒
|
|
247
245
|
*/
|
|
@@ -265,7 +263,6 @@ var CalendarDbService = class {
|
|
|
265
263
|
async deleteEventReminders(eventId) {
|
|
266
264
|
await this.db.delete(reminders).where(drizzleOrm.eq(reminders.eventId, eventId));
|
|
267
265
|
}
|
|
268
|
-
// ===== 统计和查询 =====
|
|
269
266
|
/**
|
|
270
267
|
* 获取用户在指定时间范围内的事件数量
|
|
271
268
|
*/
|
|
@@ -287,7 +284,6 @@ var CalendarDbService = class {
|
|
|
287
284
|
const events = await this.db.select().from(calendarEvents).where(
|
|
288
285
|
drizzleOrm.and(
|
|
289
286
|
drizzleOrm.eq(calendarEvents.userId, userId)
|
|
290
|
-
// 使用 ILIKE 进行不区分大小写的搜索
|
|
291
287
|
)
|
|
292
288
|
).orderBy(drizzleOrm.desc(calendarEvents.startTime));
|
|
293
289
|
return events.filter(
|
|
@@ -314,5 +310,5 @@ exports.recurrenceRules = recurrenceRules;
|
|
|
314
310
|
exports.recurrenceRulesRelations = recurrenceRulesRelations;
|
|
315
311
|
exports.reminders = reminders;
|
|
316
312
|
exports.remindersRelations = remindersRelations;
|
|
317
|
-
//# sourceMappingURL=chunk-
|
|
318
|
-
//# sourceMappingURL=chunk-
|
|
313
|
+
//# sourceMappingURL=chunk-AXP7KROR.js.map
|
|
314
|
+
//# sourceMappingURL=chunk-AXP7KROR.js.map
|