@qhr123/sa2kit 0.7.2 → 0.8.0

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.
@@ -0,0 +1,499 @@
1
+ import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
2
+
3
+ /**
4
+ * 埋点系统数据库 Schema
5
+ * Analytics Database Schema
6
+ *
7
+ * 使用方式:
8
+ * 在 backend/drizzle/migrations/schema.ts 中导入并导出:
9
+ * export { analyticsEvents } from '@lyricnote/shared/analytics/server/schema'
10
+ */
11
+ /**
12
+ * 埋点事件表
13
+ */
14
+ declare const analyticsEvents: drizzle_orm_pg_core.PgTableWithColumns<{
15
+ name: "analytics_events";
16
+ schema: undefined;
17
+ columns: {
18
+ id: drizzle_orm_pg_core.PgColumn<{
19
+ name: "id";
20
+ tableName: "analytics_events";
21
+ dataType: "string";
22
+ columnType: "PgText";
23
+ data: string;
24
+ driverParam: string;
25
+ notNull: true;
26
+ hasDefault: false;
27
+ isPrimaryKey: true;
28
+ isAutoincrement: false;
29
+ hasRuntimeDefault: false;
30
+ enumValues: [string, ...string[]];
31
+ baseColumn: never;
32
+ identity: undefined;
33
+ generated: undefined;
34
+ }, {}, {}>;
35
+ eventType: drizzle_orm_pg_core.PgColumn<{
36
+ name: "event_type";
37
+ tableName: "analytics_events";
38
+ dataType: "string";
39
+ columnType: "PgText";
40
+ data: string;
41
+ driverParam: string;
42
+ notNull: true;
43
+ hasDefault: false;
44
+ isPrimaryKey: false;
45
+ isAutoincrement: false;
46
+ hasRuntimeDefault: false;
47
+ enumValues: [string, ...string[]];
48
+ baseColumn: never;
49
+ identity: undefined;
50
+ generated: undefined;
51
+ }, {}, {}>;
52
+ eventName: drizzle_orm_pg_core.PgColumn<{
53
+ name: "event_name";
54
+ tableName: "analytics_events";
55
+ dataType: "string";
56
+ columnType: "PgText";
57
+ data: string;
58
+ driverParam: string;
59
+ notNull: true;
60
+ hasDefault: false;
61
+ isPrimaryKey: false;
62
+ isAutoincrement: false;
63
+ hasRuntimeDefault: false;
64
+ enumValues: [string, ...string[]];
65
+ baseColumn: never;
66
+ identity: undefined;
67
+ generated: undefined;
68
+ }, {}, {}>;
69
+ timestamp: drizzle_orm_pg_core.PgColumn<{
70
+ name: "timestamp";
71
+ tableName: "analytics_events";
72
+ dataType: "string";
73
+ columnType: "PgTimestampString";
74
+ data: string;
75
+ driverParam: string;
76
+ notNull: true;
77
+ hasDefault: false;
78
+ isPrimaryKey: false;
79
+ isAutoincrement: false;
80
+ hasRuntimeDefault: false;
81
+ enumValues: undefined;
82
+ baseColumn: never;
83
+ identity: undefined;
84
+ generated: undefined;
85
+ }, {}, {}>;
86
+ priority: drizzle_orm_pg_core.PgColumn<{
87
+ name: "priority";
88
+ tableName: "analytics_events";
89
+ dataType: "number";
90
+ columnType: "PgInteger";
91
+ data: number;
92
+ driverParam: string | number;
93
+ notNull: true;
94
+ hasDefault: false;
95
+ isPrimaryKey: false;
96
+ isAutoincrement: false;
97
+ hasRuntimeDefault: false;
98
+ enumValues: undefined;
99
+ baseColumn: never;
100
+ identity: undefined;
101
+ generated: undefined;
102
+ }, {}, {}>;
103
+ userId: drizzle_orm_pg_core.PgColumn<{
104
+ name: "user_id";
105
+ tableName: "analytics_events";
106
+ dataType: "string";
107
+ columnType: "PgText";
108
+ data: string;
109
+ driverParam: string;
110
+ notNull: false;
111
+ hasDefault: false;
112
+ isPrimaryKey: false;
113
+ isAutoincrement: false;
114
+ hasRuntimeDefault: false;
115
+ enumValues: [string, ...string[]];
116
+ baseColumn: never;
117
+ identity: undefined;
118
+ generated: undefined;
119
+ }, {}, {}>;
120
+ sessionId: drizzle_orm_pg_core.PgColumn<{
121
+ name: "session_id";
122
+ tableName: "analytics_events";
123
+ dataType: "string";
124
+ columnType: "PgText";
125
+ data: string;
126
+ driverParam: string;
127
+ notNull: true;
128
+ hasDefault: false;
129
+ isPrimaryKey: false;
130
+ isAutoincrement: false;
131
+ hasRuntimeDefault: false;
132
+ enumValues: [string, ...string[]];
133
+ baseColumn: never;
134
+ identity: undefined;
135
+ generated: undefined;
136
+ }, {}, {}>;
137
+ deviceId: drizzle_orm_pg_core.PgColumn<{
138
+ name: "device_id";
139
+ tableName: "analytics_events";
140
+ dataType: "string";
141
+ columnType: "PgText";
142
+ data: string;
143
+ driverParam: string;
144
+ notNull: true;
145
+ hasDefault: false;
146
+ isPrimaryKey: false;
147
+ isAutoincrement: false;
148
+ hasRuntimeDefault: false;
149
+ enumValues: [string, ...string[]];
150
+ baseColumn: never;
151
+ identity: undefined;
152
+ generated: undefined;
153
+ }, {}, {}>;
154
+ pageUrl: drizzle_orm_pg_core.PgColumn<{
155
+ name: "page_url";
156
+ tableName: "analytics_events";
157
+ dataType: "string";
158
+ columnType: "PgText";
159
+ data: string;
160
+ driverParam: string;
161
+ notNull: false;
162
+ hasDefault: false;
163
+ isPrimaryKey: false;
164
+ isAutoincrement: false;
165
+ hasRuntimeDefault: false;
166
+ enumValues: [string, ...string[]];
167
+ baseColumn: never;
168
+ identity: undefined;
169
+ generated: undefined;
170
+ }, {}, {}>;
171
+ pageTitle: drizzle_orm_pg_core.PgColumn<{
172
+ name: "page_title";
173
+ tableName: "analytics_events";
174
+ dataType: "string";
175
+ columnType: "PgText";
176
+ data: string;
177
+ driverParam: string;
178
+ notNull: false;
179
+ hasDefault: false;
180
+ isPrimaryKey: false;
181
+ isAutoincrement: false;
182
+ hasRuntimeDefault: false;
183
+ enumValues: [string, ...string[]];
184
+ baseColumn: never;
185
+ identity: undefined;
186
+ generated: undefined;
187
+ }, {}, {}>;
188
+ referrer: drizzle_orm_pg_core.PgColumn<{
189
+ name: "referrer";
190
+ tableName: "analytics_events";
191
+ dataType: "string";
192
+ columnType: "PgText";
193
+ data: string;
194
+ driverParam: string;
195
+ notNull: false;
196
+ hasDefault: false;
197
+ isPrimaryKey: false;
198
+ isAutoincrement: false;
199
+ hasRuntimeDefault: false;
200
+ enumValues: [string, ...string[]];
201
+ baseColumn: never;
202
+ identity: undefined;
203
+ generated: undefined;
204
+ }, {}, {}>;
205
+ properties: drizzle_orm_pg_core.PgColumn<{
206
+ name: "properties";
207
+ tableName: "analytics_events";
208
+ dataType: "json";
209
+ columnType: "PgJsonb";
210
+ data: unknown;
211
+ driverParam: unknown;
212
+ notNull: false;
213
+ hasDefault: false;
214
+ isPrimaryKey: false;
215
+ isAutoincrement: false;
216
+ hasRuntimeDefault: false;
217
+ enumValues: undefined;
218
+ baseColumn: never;
219
+ identity: undefined;
220
+ generated: undefined;
221
+ }, {}, {}>;
222
+ platform: drizzle_orm_pg_core.PgColumn<{
223
+ name: "platform";
224
+ tableName: "analytics_events";
225
+ dataType: "string";
226
+ columnType: "PgText";
227
+ data: string;
228
+ driverParam: string;
229
+ notNull: true;
230
+ hasDefault: false;
231
+ isPrimaryKey: false;
232
+ isAutoincrement: false;
233
+ hasRuntimeDefault: false;
234
+ enumValues: [string, ...string[]];
235
+ baseColumn: never;
236
+ identity: undefined;
237
+ generated: undefined;
238
+ }, {}, {}>;
239
+ appVersion: drizzle_orm_pg_core.PgColumn<{
240
+ name: "app_version";
241
+ tableName: "analytics_events";
242
+ dataType: "string";
243
+ columnType: "PgText";
244
+ data: string;
245
+ driverParam: string;
246
+ notNull: true;
247
+ hasDefault: false;
248
+ isPrimaryKey: false;
249
+ isAutoincrement: false;
250
+ hasRuntimeDefault: false;
251
+ enumValues: [string, ...string[]];
252
+ baseColumn: never;
253
+ identity: undefined;
254
+ generated: undefined;
255
+ }, {}, {}>;
256
+ sdkVersion: drizzle_orm_pg_core.PgColumn<{
257
+ name: "sdk_version";
258
+ tableName: "analytics_events";
259
+ dataType: "string";
260
+ columnType: "PgText";
261
+ data: string;
262
+ driverParam: string;
263
+ notNull: true;
264
+ hasDefault: false;
265
+ isPrimaryKey: false;
266
+ isAutoincrement: false;
267
+ hasRuntimeDefault: false;
268
+ enumValues: [string, ...string[]];
269
+ baseColumn: never;
270
+ identity: undefined;
271
+ generated: undefined;
272
+ }, {}, {}>;
273
+ createdAt: drizzle_orm_pg_core.PgColumn<{
274
+ name: "createdAt";
275
+ tableName: "analytics_events";
276
+ dataType: "string";
277
+ columnType: "PgTimestampString";
278
+ data: string;
279
+ driverParam: string;
280
+ notNull: true;
281
+ hasDefault: true;
282
+ isPrimaryKey: false;
283
+ isAutoincrement: false;
284
+ hasRuntimeDefault: false;
285
+ enumValues: undefined;
286
+ baseColumn: never;
287
+ identity: undefined;
288
+ generated: undefined;
289
+ }, {}, {}>;
290
+ };
291
+ dialect: "pg";
292
+ }>;
293
+
294
+ /**
295
+ * 服务端类型定义
296
+ * Server-side Types
297
+ */
298
+ interface AnalyticsEvent {
299
+ id: string;
300
+ eventType: string;
301
+ eventName: string;
302
+ timestamp: string;
303
+ priority: number;
304
+ userId?: string | null;
305
+ sessionId: string;
306
+ deviceId: string;
307
+ pageUrl?: string | null;
308
+ pageTitle?: string | null;
309
+ referrer?: string | null;
310
+ properties?: any;
311
+ platform: string;
312
+ appVersion: string;
313
+ sdkVersion: string;
314
+ }
315
+ interface AnalyticsQueryParams {
316
+ startDate?: string;
317
+ endDate?: string;
318
+ eventType?: string;
319
+ eventTypes?: string[];
320
+ userId?: string;
321
+ platform?: string;
322
+ platforms?: string[];
323
+ sessionId?: string;
324
+ limit?: number;
325
+ offset?: number;
326
+ orderBy?: 'timestamp' | 'eventType' | 'platform';
327
+ orderDirection?: 'asc' | 'desc';
328
+ }
329
+ interface AnalyticsStats {
330
+ totalEvents: number;
331
+ uniqueUsers: number;
332
+ uniqueSessions: number;
333
+ uniqueDevices: number;
334
+ eventsByType: {
335
+ eventType: string;
336
+ count: number;
337
+ }[];
338
+ eventsByPlatform: {
339
+ platform: string;
340
+ count: number;
341
+ }[];
342
+ topPages: {
343
+ pageUrl: string;
344
+ count: number;
345
+ }[];
346
+ }
347
+ interface UserBehavior {
348
+ userId: string;
349
+ eventCount: number;
350
+ lastActive: string;
351
+ platforms: string[];
352
+ topEvents: {
353
+ eventType: string;
354
+ count: number;
355
+ }[];
356
+ }
357
+ interface SessionAnalytics {
358
+ sessionId: string;
359
+ userId?: string;
360
+ deviceId: string;
361
+ platform: string;
362
+ startTime: string;
363
+ endTime: string;
364
+ duration: number;
365
+ eventCount: number;
366
+ events: AnalyticsEvent[];
367
+ }
368
+ interface DatabaseInstance {
369
+ select: (...args: any[]) => any;
370
+ insert: (...args: any[]) => any;
371
+ delete: (...args: any[]) => any;
372
+ }
373
+
374
+ /**
375
+ * 埋点分析服务
376
+ * Analytics Service
377
+ *
378
+ * 使用方式:
379
+ * import { createAnalyticsService } from '@lyricnote/shared/analytics/server'
380
+ * const service = createAnalyticsService(db, analyticsEvents, logger)
381
+ */
382
+
383
+ interface Logger {
384
+ info: (message: string, data?: any) => void;
385
+ error: (message: string, error: Error) => void;
386
+ }
387
+ /**
388
+ * 创建埋点服务实例
389
+ * @param db - Drizzle 数据库实例
390
+ * @param analyticsEventsTable - analytics_events 表定义
391
+ * @param logger - 日志实例(可选)
392
+ */
393
+ declare function createAnalyticsService(db: DatabaseInstance, analyticsEventsTable: any, logger?: Logger): {
394
+ /**
395
+ * 批量插入埋点事件
396
+ */
397
+ insertAnalyticsEvents(events: AnalyticsEvent[]): Promise<void>;
398
+ /**
399
+ * 查询埋点事件
400
+ */
401
+ queryAnalyticsEvents(params: AnalyticsQueryParams): Promise<{
402
+ events: AnalyticsEvent[];
403
+ total: number;
404
+ }>;
405
+ /**
406
+ * 获取统计数据
407
+ */
408
+ getAnalyticsStats(startDate?: string, endDate?: string, platform?: string): Promise<AnalyticsStats>;
409
+ /**
410
+ * 获取用户行为分析
411
+ */
412
+ getUserBehavior(userId: string, startDate?: string, endDate?: string): Promise<UserBehavior | null>;
413
+ /**
414
+ * 获取会话分析
415
+ */
416
+ getSessionAnalytics(sessionId: string): Promise<SessionAnalytics | null>;
417
+ /**
418
+ * 获取漏斗分析
419
+ */
420
+ getFunnelAnalysis(steps: string[], startDate?: string, endDate?: string): Promise<{
421
+ step: string;
422
+ count: number;
423
+ conversionRate: number;
424
+ }[]>;
425
+ /**
426
+ * 删除旧数据(数据清理)
427
+ */
428
+ cleanOldAnalyticsEvents(daysToKeep?: number): Promise<number>;
429
+ };
430
+
431
+ /**
432
+ * 埋点 API 路由处理器
433
+ * Analytics API Route Handlers
434
+ *
435
+ * 使用方式(Next.js):
436
+ * import { createAnalyticsHandlers } from '@lyricnote/shared/analytics/server'
437
+ * const handlers = createAnalyticsHandlers(analyticsService)
438
+ * export const POST = handlers.handleEventsPost
439
+ */
440
+
441
+ interface AnalyticsService {
442
+ insertAnalyticsEvents: (events: AnalyticsEvent[]) => Promise<void>;
443
+ queryAnalyticsEvents: (params: AnalyticsQueryParams) => Promise<{
444
+ events: AnalyticsEvent[];
445
+ total: number;
446
+ }>;
447
+ getAnalyticsStats: (startDate?: string, endDate?: string, platform?: string) => Promise<any>;
448
+ getUserBehavior: (userId: string, startDate?: string, endDate?: string) => Promise<any>;
449
+ getSessionAnalytics: (sessionId: string) => Promise<any>;
450
+ getFunnelAnalysis: (steps: string[], startDate?: string, endDate?: string) => Promise<any>;
451
+ }
452
+ interface Request {
453
+ json: () => Promise<any>;
454
+ url?: string;
455
+ nextUrl?: {
456
+ searchParams: URLSearchParams;
457
+ };
458
+ }
459
+ /**
460
+ * 创建埋点 API 处理器
461
+ */
462
+ declare function createAnalyticsHandlers(service: AnalyticsService, ResponseClass?: any): {
463
+ /**
464
+ * POST /api/analytics/events
465
+ * 处理事件上报
466
+ */
467
+ handleEventsPost(request: Request): Promise<any>;
468
+ /**
469
+ * GET /api/analytics/query
470
+ * 查询埋点事件
471
+ */
472
+ handleQueryGet(request: Request): Promise<any>;
473
+ /**
474
+ * GET /api/analytics/stats
475
+ * 获取统计数据
476
+ */
477
+ handleStatsGet(request: Request): Promise<any>;
478
+ /**
479
+ * GET /api/analytics/user/[userId]
480
+ * 获取用户行为分析
481
+ */
482
+ handleUserBehaviorGet(request: Request, params: {
483
+ userId: string;
484
+ }): Promise<any>;
485
+ /**
486
+ * GET /api/analytics/session/[sessionId]
487
+ * 获取会话分析
488
+ */
489
+ handleSessionAnalyticsGet(_request: Request, params: {
490
+ sessionId: string;
491
+ }): Promise<any>;
492
+ /**
493
+ * POST /api/analytics/funnel
494
+ * 漏斗分析
495
+ */
496
+ handleFunnelPost(request: Request): Promise<any>;
497
+ };
498
+
499
+ export { type AnalyticsEvent, type AnalyticsQueryParams, type AnalyticsStats, type DatabaseInstance, type SessionAnalytics, type UserBehavior, analyticsEvents, createAnalyticsHandlers, createAnalyticsService };