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.
Files changed (39) hide show
  1. package/dist/auth/index.d.mts +11 -1
  2. package/dist/auth/index.d.ts +11 -1
  3. package/dist/auth/index.js +9 -0
  4. package/dist/auth/index.js.map +1 -1
  5. package/dist/auth/index.mjs +9 -1
  6. package/dist/auth/index.mjs.map +1 -1
  7. package/dist/calendar/index.d.mts +497 -611
  8. package/dist/calendar/index.d.ts +497 -611
  9. package/dist/calendar/index.js +4104 -4088
  10. package/dist/calendar/index.js.map +1 -1
  11. package/dist/calendar/index.mjs +4092 -4075
  12. package/dist/calendar/index.mjs.map +1 -1
  13. package/dist/calendar/routes/index.js +21 -21
  14. package/dist/calendar/routes/index.mjs +1 -1
  15. package/dist/calendar/server.d.mts +3 -8
  16. package/dist/calendar/server.d.ts +3 -8
  17. package/dist/calendar/server.js +14 -14
  18. package/dist/calendar/server.js.map +1 -1
  19. package/dist/calendar/server.mjs +3 -3
  20. package/dist/calendar/server.mjs.map +1 -1
  21. package/dist/{chunk-OCIJT5VO.mjs → chunk-6WXOA4BE.mjs} +3 -7
  22. package/dist/chunk-6WXOA4BE.mjs.map +1 -0
  23. package/dist/{chunk-FJU3NA6B.js → chunk-AXP7KROR.js} +3 -7
  24. package/dist/chunk-AXP7KROR.js.map +1 -0
  25. package/dist/{chunk-NRYHBGU6.js → chunk-IEA55H3G.js} +5 -5
  26. package/dist/chunk-IEA55H3G.js.map +1 -0
  27. package/dist/{chunk-KFDEOLDH.mjs → chunk-R2F4BXUU.mjs} +5 -5
  28. package/dist/chunk-R2F4BXUU.mjs.map +1 -0
  29. package/dist/index.d.mts +96 -103
  30. package/dist/index.d.ts +96 -103
  31. package/dist/index.js +433 -466
  32. package/dist/index.js.map +1 -1
  33. package/dist/index.mjs +371 -402
  34. package/dist/index.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/dist/chunk-FJU3NA6B.js.map +0 -1
  37. package/dist/chunk-KFDEOLDH.mjs.map +0 -1
  38. package/dist/chunk-NRYHBGU6.js.map +0 -1
  39. package/dist/chunk-OCIJT5VO.mjs.map +0 -1
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkFJU3NA6B_js = require('../../chunk-FJU3NA6B.js');
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
- chunkFJU3NA6B_js.calendarDbService.setDb(db);
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 chunkFJU3NA6B_js.calendarDbService.getAllEvents(user.id, startDate, endDate);
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 chunkFJU3NA6B_js.calendarDbService.createEvent(eventData);
83
+ const newEvent = await chunkAXP7KROR_js.calendarDbService.createEvent(eventData);
84
84
  if (body.recurrence) {
85
- await chunkFJU3NA6B_js.calendarDbService.createRecurrenceRule({
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 chunkFJU3NA6B_js.calendarDbService.createReminder({
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 chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
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
- chunkFJU3NA6B_js.calendarDbService.getRecurrenceRule(eventId),
135
- chunkFJU3NA6B_js.calendarDbService.getEventReminders(eventId)
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 chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
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 chunkFJU3NA6B_js.calendarDbService.updateEvent(eventId, updateData);
177
+ const updatedEvent = await chunkAXP7KROR_js.calendarDbService.updateEvent(eventId, updateData);
178
178
  if (body.recurrence !== void 0) {
179
- await chunkFJU3NA6B_js.calendarDbService.deleteRecurrenceRule(eventId);
179
+ await chunkAXP7KROR_js.calendarDbService.deleteRecurrenceRule(eventId);
180
180
  if (body.recurrence) {
181
- await chunkFJU3NA6B_js.calendarDbService.createRecurrenceRule({
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 chunkFJU3NA6B_js.calendarDbService.deleteEventReminders(eventId);
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 chunkFJU3NA6B_js.calendarDbService.createReminder({
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 chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
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 chunkFJU3NA6B_js.calendarDbService.deleteEvent(eventId);
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 chunkFJU3NA6B_js.calendarDbService.getEventById(id);
255
+ const event = await chunkAXP7KROR_js.calendarDbService.getEventById(id);
256
256
  if (event && event.userId === user.id) {
257
- await chunkFJU3NA6B_js.calendarDbService.deleteEvent(id);
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 chunkFJU3NA6B_js.calendarDbService.getUserConfig(user.id);
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 chunkFJU3NA6B_js.calendarDbService.upsertUserConfig(user.id, body);
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,
@@ -1,4 +1,4 @@
1
- import { calendarDbService } from '../../chunk-OCIJT5VO.mjs';
1
+ import { calendarDbService } from '../../chunk-6WXOA4BE.mjs';
2
2
  import '../../chunk-AIKEVVDR.mjs';
3
3
  import '../../chunk-BJTO5JO5.mjs';
4
4
  import { NextResponse } from 'next/server';
@@ -5,7 +5,7 @@ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
5
5
  * 简化版日历数据库服务
6
6
  *
7
7
  * 提供基础的数据库操作,避免复杂的类型转换
8
- * 使用方式:需要先通过 setDb() 设置数据库实例
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 '@qhr123/sa2kit/calendar/server';
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 = "@qhr123/sa2kit/calendar/server";
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
- * 使用方式:需要先通过 setDb() 设置数据库实例
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 '@qhr123/sa2kit/calendar/server';
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 = "@qhr123/sa2kit/calendar/server";
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 };
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkFJU3NA6B_js = require('../chunk-FJU3NA6B.js');
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 chunkFJU3NA6B_js.calendarDbService.getEventById(eventId);
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 = "@qhr123/sa2kit/calendar/server";
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 chunkFJU3NA6B_js.calendarConfigs; }
166
+ get: function () { return chunkAXP7KROR_js.calendarConfigs; }
167
167
  });
168
168
  Object.defineProperty(exports, "calendarConfigsRelations", {
169
169
  enumerable: true,
170
- get: function () { return chunkFJU3NA6B_js.calendarConfigsRelations; }
170
+ get: function () { return chunkAXP7KROR_js.calendarConfigsRelations; }
171
171
  });
172
172
  Object.defineProperty(exports, "calendarDbService", {
173
173
  enumerable: true,
174
- get: function () { return chunkFJU3NA6B_js.calendarDbService; }
174
+ get: function () { return chunkAXP7KROR_js.calendarDbService; }
175
175
  });
176
176
  Object.defineProperty(exports, "calendarEvents", {
177
177
  enumerable: true,
178
- get: function () { return chunkFJU3NA6B_js.calendarEvents; }
178
+ get: function () { return chunkAXP7KROR_js.calendarEvents; }
179
179
  });
180
180
  Object.defineProperty(exports, "calendarEventsRelations", {
181
181
  enumerable: true,
182
- get: function () { return chunkFJU3NA6B_js.calendarEventsRelations; }
182
+ get: function () { return chunkAXP7KROR_js.calendarEventsRelations; }
183
183
  });
184
184
  Object.defineProperty(exports, "eventShares", {
185
185
  enumerable: true,
186
- get: function () { return chunkFJU3NA6B_js.eventShares; }
186
+ get: function () { return chunkAXP7KROR_js.eventShares; }
187
187
  });
188
188
  Object.defineProperty(exports, "eventSharesRelations", {
189
189
  enumerable: true,
190
- get: function () { return chunkFJU3NA6B_js.eventSharesRelations; }
190
+ get: function () { return chunkAXP7KROR_js.eventSharesRelations; }
191
191
  });
192
192
  Object.defineProperty(exports, "recurrenceRules", {
193
193
  enumerable: true,
194
- get: function () { return chunkFJU3NA6B_js.recurrenceRules; }
194
+ get: function () { return chunkAXP7KROR_js.recurrenceRules; }
195
195
  });
196
196
  Object.defineProperty(exports, "recurrenceRulesRelations", {
197
197
  enumerable: true,
198
- get: function () { return chunkFJU3NA6B_js.recurrenceRulesRelations; }
198
+ get: function () { return chunkAXP7KROR_js.recurrenceRulesRelations; }
199
199
  });
200
200
  Object.defineProperty(exports, "reminders", {
201
201
  enumerable: true,
202
- get: function () { return chunkFJU3NA6B_js.reminders; }
202
+ get: function () { return chunkAXP7KROR_js.reminders; }
203
203
  });
204
204
  Object.defineProperty(exports, "remindersRelations", {
205
205
  enumerable: true,
206
- get: function () { return chunkFJU3NA6B_js.remindersRelations; }
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":";;;;;;;AAiEO,IAAM,uBAAA,GAA0B;AAAA,EACrC,cAAA,EAAgB,CAAA;AAAA;AAAA,EAChB,YAAA,EAAc;AAAA,IACZ,KAAA,EAAO,OAAA;AAAA,IACP,GAAA,EAAK;AAAA,GACP;AAAA,EACA,QAAA,EAAU,eAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,OAAA;AAAA,EACZ,WAAA,EAAa,OAAA;AAAA,EACb,iBAAA,EAAmB,SAAA;AAAA,EACnB,QAAA,EAAU,IAAA;AAAA,EACV,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,SAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,GAAA,EAAK,SAAA;AAAA,IACL,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM,SAAA;AAAA,IACN,MAAA,EAAQ,SAAA;AAAA,IACR,IAAA,EAAM;AAAA;AAEV;AAKO,SAAS,kBAAkB,SAAA,EAAsD;AACtF,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,IAAI,CAAC,SAAA,CAAU,KAAA,IAAS,OAAO,SAAA,CAAU,KAAA,KAAU,QAAA,IAAY,SAAA,CAAU,KAAA,CAAM,IAAA,EAAK,KAAM,EAAA,EAAI;AAC5F,IAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,UAAU,SAAA,EAAW;AACxB,IAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,EACxB;AAEA,EAAA,IAAI,CAAC,UAAU,OAAA,EAAS;AACtB,IAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,SAAA,CAAU,SAAA,IAAa,SAAA,CAAU,OAAA,EAAS;AAC5C,IAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC9C,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAE1C,IAAA,IAAI,KAAA,CAAM,SAAA,CAAU,OAAA,EAAS,CAAA,EAAG;AAC9B,MAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,IACxB;AAEA,IAAA,IAAI,SAAA,CAAU,OAAA,EAAQ,IAAK,OAAA,CAAQ,SAAQ,EAAG;AAC5C,MAAA,MAAA,CAAO,KAAK,0EAAc,CAAA;AAAA,IAC5B;AAAA,EACF;AAGA,EAAA,IAAI,UAAU,KAAA,IAAS,CAAC,oBAAoB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA,EAAG;AACjE,IAAA,MAAA,CAAO,KAAK,4HAA6B,CAAA;AAAA,EAC3C;AAGA,EAAA,IAAI,CAAC,UAAU,MAAA,IAAU,OAAO,UAAU,MAAA,KAAW,QAAA,IAAY,SAAA,CAAU,MAAA,IAAU,CAAA,EAAG;AACtF,IAAA,MAAA,CAAO,KAAK,4BAAQ,CAAA;AAAA,EACtB;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAKO,SAAS,uBAAuB,cAAA,EAA2D;AAChG,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,CAAC,eAAe,QAAA,EAAU;AAC5B,IAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,EACxB;AAEA,EAAA,MAAM,iBAAiB,CAAC,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,UAAU,QAAQ,CAAA;AACxE,EAAA,IAAI,eAAe,QAAA,IAAY,CAAC,eAAe,QAAA,CAAS,cAAA,CAAe,QAAQ,CAAA,EAAG;AAChF,IAAA,MAAA,CAAO,KAAK,sCAAQ,CAAA;AAAA,EACtB;AAEA,EAAA,IAAI,CAAC,cAAA,CAAe,QAAA,IAAY,cAAA,CAAe,WAAW,CAAA,EAAG;AAC3D,IAAA,MAAA,CAAO,KAAK,mDAAW,CAAA;AAAA,EACzB;AAGA,EAAA,IAAI,cAAA,CAAe,OAAA,IAAW,cAAA,CAAe,KAAA,EAAO;AAClD,IAAA,MAAA,CAAO,KAAK,4FAAiB,CAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,eAAe,OAAA,EAAS;AAC1B,IAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA;AAC/C,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,OAAA,EAAS,CAAA,EAAG;AAC5B,MAAA,MAAA,CAAO,KAAK,kDAAU,CAAA;AAAA,IACxB;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,KAAA,KAAU,cAAA,CAAe,QAAQ,CAAA,IAAK,cAAA,CAAe,QAAQ,GAAA,CAAA,EAAO;AACrF,IAAA,MAAA,CAAO,KAAK,8DAAiB,CAAA;AAAA,EAC/B;AAEA,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,IACzB;AAAA,GACF;AACF;AAKO,SAAS,2BAAA,CACd,SAAA,EACA,cAAA,EACA,YAAA,GAAuB,GAAA,EACoB;AAC3C,EAAA,MAAM,YAAuD,EAAC;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAI,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,IAAI,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,EAAQ,GAAI,UAAU,OAAA,EAAQ;AAEvD,EAAA,IAAI,WAAA,GAAc,IAAI,IAAA,CAAK,SAAS,CAAA;AACpC,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,MAAM,UAAU,cAAA,CAAe,OAAA,GAAU,IAAI,IAAA,CAAK,cAAA,CAAe,OAAO,CAAA,GAAI,IAAA;AAC5E,EAAA,MAAM,QAAA,GAAW,eAAe,KAAA,IAAS,YAAA;AAEzC,EAAA,OAAO,QAAQ,QAAA,EAAU;AAEvB,IAAA,IAAI,OAAA,IAAW,cAAc,OAAA,EAAS;AACpC,MAAA;AAAA,IACF;AAGA,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,SAAA,EAAW,IAAI,IAAA,CAAK,WAAW,CAAA;AAAA,MAC/B,SAAS,IAAI,IAAA,CAAK,WAAA,CAAY,OAAA,KAAY,QAAQ;AAAA,KACnD,CAAA;AAED,IAAA,KAAA,EAAA;AAGA,IAAA,QAAQ,eAAe,QAAA;AAAU,MAC/B,KAAK,OAAA;AACH,QAAA,WAAA,CAAY,OAAA,CAAQ,WAAA,CAAY,OAAA,EAAQ,GAAI,eAAe,QAAQ,CAAA;AACnE,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,WAAA,CAAY,QAAQ,WAAA,CAAY,OAAA,EAAQ,GAAK,CAAA,GAAI,eAAe,QAAS,CAAA;AACzE,QAAA;AAAA,MACF,KAAK,SAAA;AACH,QAAA,WAAA,CAAY,QAAA,CAAS,WAAA,CAAY,QAAA,EAAS,GAAI,eAAe,QAAQ,CAAA;AACrE,QAAA;AAAA,MACF,KAAK,QAAA;AACH,QAAA,WAAA,CAAY,WAAA,CAAY,WAAA,CAAY,WAAA,EAAY,GAAI,eAAe,QAAQ,CAAA;AAC3E,QAAA;AAGA;AACJ,EACF;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,qBAAA,CAAsB,gBAAsB,cAAA,EAA8B;AACxF,EAAA,OAAO,IAAI,IAAA,CAAK,cAAA,CAAe,OAAA,KAAY,cAAc,CAAA;AAC3D;AAKO,SAAS,mBAAA,CAAoB,SAAiB,MAAA,EAA6B;AAChF,EAAA,OAAO,QAAA,CAAS,IAAA;AAAA,IACd;AAAA,MACE,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,OAAA;AAAA,MACP;AAAA,KACF;AAAA,IACA,EAAE,QAAQ,GAAA;AAAI,GAChB;AACF;AAKO,SAAS,qBAAA,CAAsB,MAAW,OAAA,EAA4B;AAC3E,EAAA,OAAO,SAAS,IAAA,CAAK;AAAA,IACnB,OAAA,EAAS,IAAA;AAAA,IACT,IAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH;AAKA,eAAsB,oBAAA,CACpB,OAAA,EACA,MAAA,EACA,kBAAA,GAAuC,MAAA,EACrB;AAClB,EAAA,IAAI;AAEF,IAAA,MAAM,KAAA,GAAQ,MAAMA,kCAAA,CAAkB,YAAA,CAAa,OAAO,CAAA;AAC1D,IAAA,IAAI,CAAC,OAAO,OAAO,KAAA;AAGnB,IAAA,OAAO,MAAM,MAAA,KAAW,MAAA;AAAA,EAC1B,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,gEAAc,KAAK,CAAA;AACjC,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,IAAM,8BAAA,GAAiC;AACvC,IAAM,2BAAA,GAA8B","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'; "]}
@@ -1,5 +1,5 @@
1
- import { calendarDbService } from '../chunk-OCIJT5VO.mjs';
2
- export { calendarConfigs, calendarConfigsRelations, calendarDbService, calendarEvents, calendarEventsRelations, eventShares, eventSharesRelations, recurrenceRules, recurrenceRulesRelations, reminders, remindersRelations } from '../chunk-OCIJT5VO.mjs';
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 = "@qhr123/sa2kit/calendar/server";
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(db) before using the service.");
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-OCIJT5VO.mjs.map
306
- //# sourceMappingURL=chunk-OCIJT5VO.mjs.map
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(db) before using the service.");
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-FJU3NA6B.js.map
318
- //# sourceMappingURL=chunk-FJU3NA6B.js.map
313
+ //# sourceMappingURL=chunk-AXP7KROR.js.map
314
+ //# sourceMappingURL=chunk-AXP7KROR.js.map