enterprise-logging-system 1.1.21 → 1.1.23

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 (26) hide show
  1. package/dist/backend/controllers/LogController.d.ts.map +1 -1
  2. package/dist/backend/controllers/LogController.js +4 -2
  3. package/dist/backend/controllers/LogController.js.map +1 -1
  4. package/dist/backend/models/DailyChangeSummary.d.ts +243 -0
  5. package/dist/backend/models/DailyChangeSummary.d.ts.map +1 -0
  6. package/dist/backend/models/DailyChangeSummary.js +29 -0
  7. package/dist/backend/models/DailyChangeSummary.js.map +1 -0
  8. package/dist/backend/models/DailyExportSummary.d.ts +238 -0
  9. package/dist/backend/models/DailyExportSummary.d.ts.map +1 -0
  10. package/dist/backend/models/DailyExportSummary.js +29 -0
  11. package/dist/backend/models/DailyExportSummary.js.map +1 -0
  12. package/dist/backend/models/DailySessionSummary.d.ts +222 -70
  13. package/dist/backend/models/DailySessionSummary.d.ts.map +1 -1
  14. package/dist/backend/models/DailySessionSummary.js +20 -56
  15. package/dist/backend/models/DailySessionSummary.js.map +1 -1
  16. package/dist/backend/repositories/DailySessionSummaryRepository.d.ts +15 -6
  17. package/dist/backend/repositories/DailySessionSummaryRepository.d.ts.map +1 -1
  18. package/dist/backend/repositories/DailySessionSummaryRepository.js +119 -77
  19. package/dist/backend/repositories/DailySessionSummaryRepository.js.map +1 -1
  20. package/dist/backend/services/AccessLoggingService.d.ts +2 -0
  21. package/dist/backend/services/AccessLoggingService.d.ts.map +1 -1
  22. package/dist/backend/services/AccessLoggingService.js +2 -2
  23. package/dist/backend/services/AccessLoggingService.js.map +1 -1
  24. package/dist/backend/services/LoggingService.js +2 -2
  25. package/dist/backend/services/LoggingService.js.map +1 -1
  26. package/package.json +1 -1
@@ -1,93 +1,245 @@
1
- import { BaseLogEntry, GeoLocation, BrowserInfo } from '../../shared/types';
2
1
  /**
3
- * Master/Summary table for daily session logs
4
- * One record per user per day for listing purposes
2
+ * Daily Session Summary - Master/Detail Pattern for Session Logs
3
+ *
4
+ * Architecture:
5
+ * - ONE DailySessionSummary record per user (across ALL days) - MASTER
6
+ * - Multiple SessionDetail records (one per session) - DETAIL
7
+ * - SessionDetail records have sessionDate field for day-wise filtering
5
8
  */
6
- export interface DailySessionSummary extends BaseLogEntry {
9
+ export interface SessionDetail {
10
+ _id: string;
11
+ userSummaryId: string;
12
+ userKey: string;
13
+ sessionDate: Date;
14
+ tenantId: string;
15
+ userId: string;
16
+ userRole: string;
17
+ sessionId: string;
7
18
  username: string;
8
19
  employeeId?: string;
9
- dailyKey: string;
10
- date: Date;
11
- totalSessions: number;
20
+ loginTime: Date;
21
+ logoutTime?: Date;
22
+ sessionDuration: number;
12
23
  totalActiveDuration: number;
13
24
  totalIdleDuration: number;
14
- totalSessionDuration: number;
15
- firstLoginTime: Date;
16
- lastLogoutTime?: Date;
25
+ sessionState: 'ACTIVE' | 'ENDED' | 'EXPIRED';
26
+ logoutReason?: 'USER' | 'TIMEOUT' | 'ERROR';
17
27
  lastActivityTime: Date;
18
- sessionIds: string[];
19
- primarySessionId: string;
28
+ heartbeatCount: number;
29
+ lastHeartbeatTime: Date;
30
+ idleThreshold: number;
31
+ ipAddress: string;
32
+ userAgent: string;
33
+ browser?: any;
34
+ geoLocation?: any;
35
+ activityPeriods?: Array<{
36
+ startTime: Date;
37
+ endTime: Date;
38
+ duration: number;
39
+ type: 'ACTIVE' | 'IDLE';
40
+ lastActivityTime?: Date;
41
+ }>;
42
+ sessionEvents?: Array<{
43
+ type: 'LOGIN' | 'LOGOUT' | 'AUTO_LOGOUT' | 'SESSION_RESUME' | 'IDLE_START' | 'IDLE_END';
44
+ timestamp: Date;
45
+ reason?: string;
46
+ }>;
47
+ metadata?: Record<string, any>;
48
+ }
49
+ export interface DailySessionSummary {
50
+ _id: string;
51
+ userKey: string;
52
+ tenantId: string;
53
+ userId: string;
54
+ username: string;
55
+ employeeId?: string;
56
+ userRole: string;
57
+ totalSessions: number;
58
+ totalActiveSessions: number;
59
+ totalEndedSessions: number;
60
+ totalSessionDuration: number;
61
+ totalActiveDuration: number;
62
+ totalIdleDuration: number;
63
+ totalDays: number;
20
64
  activeSessions: number;
21
65
  totalHeartbeats: number;
22
66
  totalActivityRecords: number;
67
+ firstSessionTime: Date;
68
+ lastSessionTime: Date;
69
+ lastLogoutTime?: Date;
70
+ sessionIds: string[];
71
+ activeSessionIds: string[];
23
72
  sessionStates: {
24
73
  active: number;
25
74
  ended: number;
26
75
  expired: number;
27
76
  };
28
- browser?: BrowserInfo;
29
- geoLocation?: GeoLocation;
30
- lastIpAddress?: string;
31
- lastUserAgent?: string;
32
- metadata?: {
77
+ ipAddress: string;
78
+ userAgent: string;
79
+ browser?: any;
80
+ geoLocation?: any;
81
+ metadata: {
82
+ sessionCount: Record<string, number>;
83
+ dailySessions: Record<string, {
84
+ sessions: number;
85
+ activeDuration: number;
86
+ idleDuration: number;
87
+ totalDuration: number;
88
+ }>;
33
89
  sessionDurations: Record<string, number>;
34
- loginTimes: Date[];
35
- logoutTimes: Date[];
36
- idleThreshold: number;
37
- [key: string]: any;
38
90
  };
39
91
  createdAt: Date;
40
92
  updatedAt: Date;
41
93
  version: number;
42
94
  }
43
- /**
44
- * Detailed session records
45
- * Multiple records per user per day (one per login/logout cycle)
46
- */
47
- export interface SessionDetail extends BaseLogEntry {
48
- dailySummaryId: string;
49
- dailyKey: string;
50
- username: string;
51
- employeeId?: string;
52
- sessionState: 'ACTIVE' | 'ENDED' | 'EXPIRED';
53
- loginTime: Date;
54
- logoutTime?: Date;
55
- logoutReason?: 'USER' | 'TIMEOUT' | 'ERROR';
56
- idleThreshold: number;
57
- totalActiveDuration: number;
58
- totalIdleDuration: number;
59
- sessionDuration: number;
60
- activityPeriods: Array<{
61
- startTime: Date;
62
- endTime: Date;
63
- duration: number;
64
- type: 'ACTIVE' | 'IDLE';
65
- lastActivityTime: Date;
66
- }>;
67
- sessionEvents: Array<{
68
- type: 'LOGIN' | 'LOGOUT' | 'AUTO_LOGOUT' | 'SESSION_RESUME' | 'IDLE_START' | 'IDLE_END';
69
- timestamp: Date;
70
- reason?: string;
71
- }>;
72
- lastActivityTime: Date;
73
- heartbeatCount: number;
74
- heartbeatInterval?: number;
75
- lastHeartbeatTime: Date;
76
- visibilityChanges: Array<{
77
- timestamp: Date;
78
- state: 'visible' | 'hidden';
79
- duration?: number;
80
- }>;
81
- browser?: BrowserInfo;
82
- geoLocation?: GeoLocation;
83
- }
84
- interface IndexDefinition {
85
- keys: Record<string, 1 | -1>;
95
+ export declare const DAILY_SESSION_SUMMARY_INDEXES: ({
96
+ keys: {
97
+ userKey: number;
98
+ tenantId?: undefined;
99
+ userId?: undefined;
100
+ lastSessionTime?: undefined;
101
+ totalSessions?: undefined;
102
+ };
86
103
  name: string;
87
- unique?: boolean;
88
- expireAfterSeconds?: number;
89
- }
90
- export declare const DAILY_SESSION_SUMMARY_INDEXES: IndexDefinition[];
91
- export declare const SESSION_DETAIL_INDEXES: IndexDefinition[];
92
- export {};
104
+ unique: boolean;
105
+ } | {
106
+ keys: {
107
+ tenantId: number;
108
+ userId: number;
109
+ userKey?: undefined;
110
+ lastSessionTime?: undefined;
111
+ totalSessions?: undefined;
112
+ };
113
+ name: string;
114
+ unique?: undefined;
115
+ } | {
116
+ keys: {
117
+ userId: number;
118
+ userKey?: undefined;
119
+ tenantId?: undefined;
120
+ lastSessionTime?: undefined;
121
+ totalSessions?: undefined;
122
+ };
123
+ name: string;
124
+ unique?: undefined;
125
+ } | {
126
+ keys: {
127
+ lastSessionTime: number;
128
+ userKey?: undefined;
129
+ tenantId?: undefined;
130
+ userId?: undefined;
131
+ totalSessions?: undefined;
132
+ };
133
+ name: string;
134
+ unique?: undefined;
135
+ } | {
136
+ keys: {
137
+ totalSessions: number;
138
+ userKey?: undefined;
139
+ tenantId?: undefined;
140
+ userId?: undefined;
141
+ lastSessionTime?: undefined;
142
+ };
143
+ name: string;
144
+ unique?: undefined;
145
+ })[];
146
+ export declare const SESSION_DETAIL_INDEXES: ({
147
+ keys: {
148
+ userSummaryId: number;
149
+ sessionDate: number;
150
+ userKey?: undefined;
151
+ sessionId?: undefined;
152
+ userId?: undefined;
153
+ loginTime?: undefined;
154
+ tenantId?: undefined;
155
+ sessionState?: undefined;
156
+ };
157
+ name: string;
158
+ unique?: undefined;
159
+ expireAfterSeconds?: undefined;
160
+ } | {
161
+ keys: {
162
+ userKey: number;
163
+ sessionDate: number;
164
+ userSummaryId?: undefined;
165
+ sessionId?: undefined;
166
+ userId?: undefined;
167
+ loginTime?: undefined;
168
+ tenantId?: undefined;
169
+ sessionState?: undefined;
170
+ };
171
+ name: string;
172
+ unique?: undefined;
173
+ expireAfterSeconds?: undefined;
174
+ } | {
175
+ keys: {
176
+ sessionId: number;
177
+ userSummaryId?: undefined;
178
+ sessionDate?: undefined;
179
+ userKey?: undefined;
180
+ userId?: undefined;
181
+ loginTime?: undefined;
182
+ tenantId?: undefined;
183
+ sessionState?: undefined;
184
+ };
185
+ name: string;
186
+ unique: boolean;
187
+ expireAfterSeconds?: undefined;
188
+ } | {
189
+ keys: {
190
+ userId: number;
191
+ loginTime: number;
192
+ userSummaryId?: undefined;
193
+ sessionDate?: undefined;
194
+ userKey?: undefined;
195
+ sessionId?: undefined;
196
+ tenantId?: undefined;
197
+ sessionState?: undefined;
198
+ };
199
+ name: string;
200
+ unique?: undefined;
201
+ expireAfterSeconds?: undefined;
202
+ } | {
203
+ keys: {
204
+ tenantId: number;
205
+ sessionDate: number;
206
+ userSummaryId?: undefined;
207
+ userKey?: undefined;
208
+ sessionId?: undefined;
209
+ userId?: undefined;
210
+ loginTime?: undefined;
211
+ sessionState?: undefined;
212
+ };
213
+ name: string;
214
+ unique?: undefined;
215
+ expireAfterSeconds?: undefined;
216
+ } | {
217
+ keys: {
218
+ sessionState: number;
219
+ userSummaryId?: undefined;
220
+ sessionDate?: undefined;
221
+ userKey?: undefined;
222
+ sessionId?: undefined;
223
+ userId?: undefined;
224
+ loginTime?: undefined;
225
+ tenantId?: undefined;
226
+ };
227
+ name: string;
228
+ unique?: undefined;
229
+ expireAfterSeconds?: undefined;
230
+ } | {
231
+ keys: {
232
+ loginTime: number;
233
+ userSummaryId?: undefined;
234
+ sessionDate?: undefined;
235
+ userKey?: undefined;
236
+ sessionId?: undefined;
237
+ userId?: undefined;
238
+ tenantId?: undefined;
239
+ sessionState?: undefined;
240
+ };
241
+ name: string;
242
+ expireAfterSeconds: number;
243
+ unique?: undefined;
244
+ })[];
93
245
  //# sourceMappingURL=DailySessionSummary.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DailySessionSummary.d.ts","sourceRoot":"","sources":["../../../src/backend/models/DailySessionSummary.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"DailySessionSummary.d.ts","sourceRoot":"","sources":["../../../src/backend/models/DailySessionSummary.ts"],"names":[],"mappings":"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"}
@@ -1,64 +1,28 @@
1
1
  "use strict";
2
+ /**
3
+ * Daily Session Summary - Master/Detail Pattern for Session Logs
4
+ *
5
+ * Architecture:
6
+ * - ONE DailySessionSummary record per user (across ALL days) - MASTER
7
+ * - Multiple SessionDetail records (one per session) - DETAIL
8
+ * - SessionDetail records have sessionDate field for day-wise filtering
9
+ */
2
10
  Object.defineProperty(exports, "__esModule", { value: true });
3
11
  exports.SESSION_DETAIL_INDEXES = exports.DAILY_SESSION_SUMMARY_INDEXES = void 0;
4
- // Database indexes for optimal performance
5
12
  exports.DAILY_SESSION_SUMMARY_INDEXES = [
6
- // Unique constraint - one record per user per day
7
- {
8
- keys: { dailyKey: 1 },
9
- name: 'daily_key_unique_idx',
10
- unique: true
11
- },
12
- // Query optimization
13
- {
14
- keys: { tenantId: 1, userId: 1, date: -1 },
15
- name: 'tenant_user_date_idx'
16
- },
17
- {
18
- keys: { tenantId: 1, date: -1 },
19
- name: 'tenant_date_idx'
20
- },
21
- {
22
- keys: { date: -1, activeSessions: 1 },
23
- name: 'date_active_sessions_idx'
24
- },
25
- // TTL for data retention (optional - 90 days)
26
- {
27
- keys: { date: 1 },
28
- name: 'date_ttl_idx',
29
- expireAfterSeconds: 7776000 // 90 days
30
- }
13
+ { keys: { userKey: 1 }, name: 'user_key_unique_idx', unique: true },
14
+ { keys: { tenantId: 1, userId: 1 }, name: 'tenant_user_idx' },
15
+ { keys: { userId: 1 }, name: 'user_id_idx' },
16
+ { keys: { lastSessionTime: -1 }, name: 'last_session_time_idx' },
17
+ { keys: { totalSessions: -1 }, name: 'total_sessions_idx' }
31
18
  ];
32
19
  exports.SESSION_DETAIL_INDEXES = [
33
- // Unique constraint - one record per sessionId
34
- {
35
- keys: { sessionId: 1 },
36
- name: 'session_id_unique_idx',
37
- unique: true
38
- },
39
- // Link to daily summary
40
- {
41
- keys: { dailySummaryId: 1, loginTime: -1 },
42
- name: 'daily_summary_login_idx'
43
- },
44
- {
45
- keys: { dailyKey: 1, sessionState: 1, loginTime: -1 },
46
- name: 'daily_key_state_login_idx'
47
- },
48
- // Query optimization
49
- {
50
- keys: { tenantId: 1, userId: 1, loginTime: -1 },
51
- name: 'tenant_user_login_idx'
52
- },
53
- {
54
- keys: { sessionState: 1, loginTime: -1 },
55
- name: 'session_state_login_idx'
56
- },
57
- // TTL for detailed data (optional - 90 days)
58
- {
59
- keys: { loginTime: 1 },
60
- name: 'login_time_ttl_idx',
61
- expireAfterSeconds: 7776000 // 90 days
62
- }
20
+ { keys: { userSummaryId: 1, sessionDate: -1 }, name: 'summary_date_idx' },
21
+ { keys: { userKey: 1, sessionDate: -1 }, name: 'user_date_idx' },
22
+ { keys: { sessionId: 1 }, name: 'session_id_unique_idx', unique: true },
23
+ { keys: { userId: 1, loginTime: -1 }, name: 'user_login_idx' },
24
+ { keys: { tenantId: 1, sessionDate: -1 }, name: 'tenant_date_idx' },
25
+ { keys: { sessionState: 1 }, name: 'session_state_idx' },
26
+ { keys: { loginTime: 1 }, name: 'login_time_idx', expireAfterSeconds: 7776000 } // 90 days TTL
63
27
  ];
64
28
  //# sourceMappingURL=DailySessionSummary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DailySessionSummary.js","sourceRoot":"","sources":["../../../src/backend/models/DailySessionSummary.ts"],"names":[],"mappings":";;;AAmIA,2CAA2C;AAC9B,QAAA,6BAA6B,GAAsB;IAC9D,kDAAkD;IAClD;QACE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;QACrB,IAAI,EAAE,sBAAsB;QAC5B,MAAM,EAAE,IAAI;KACb;IACD,qBAAqB;IACrB;QACE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC1C,IAAI,EAAE,sBAAsB;KAC7B;IACD;QACE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;QAC/B,IAAI,EAAE,iBAAiB;KACxB;IACD;QACE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE;QACrC,IAAI,EAAE,0BAA0B;KACjC;IACD,8CAA8C;IAC9C;QACE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;QACjB,IAAI,EAAE,cAAc;QACpB,kBAAkB,EAAE,OAAO,CAAC,UAAU;KACvC;CACF,CAAC;AAEW,QAAA,sBAAsB,GAAsB;IACvD,+CAA+C;IAC/C;QACE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;QACtB,IAAI,EAAE,uBAAuB;QAC7B,MAAM,EAAE,IAAI;KACb;IACD,wBAAwB;IACxB;QACE,IAAI,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;QAC1C,IAAI,EAAE,yBAAyB;KAChC;IACD;QACE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;QACrD,IAAI,EAAE,2BAA2B;KAClC;IACD,qBAAqB;IACrB;QACE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;QAC/C,IAAI,EAAE,uBAAuB;KAC9B;IACD;QACE,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE;QACxC,IAAI,EAAE,yBAAyB;KAChC;IACD,6CAA6C;IAC7C;QACE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE;QACtB,IAAI,EAAE,oBAAoB;QAC1B,kBAAkB,EAAE,OAAO,CAAC,UAAU;KACvC;CACF,CAAC"}
1
+ {"version":3,"file":"DailySessionSummary.js","sourceRoot":"","sources":["../../../src/backend/models/DailySessionSummary.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AA0HU,QAAA,6BAA6B,GAAG;IAC3C,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE;IACnE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;IAC7D,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;IAC5C,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE;IAChE,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE;CAC5D,CAAC;AAEW,QAAA,sBAAsB,GAAG;IACpC,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;IACzE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;IAChE,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE;IACvE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE;IAC9D,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE;IACnE,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;IACxD,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,OAAO,EAAE,CAAC,cAAc;CAC/F,CAAC"}
@@ -8,14 +8,22 @@ export declare class DailySessionSummaryRepository extends BaseRepository<DailyS
8
8
  constructor(db: Db);
9
9
  private ensureIndexes;
10
10
  /**
11
- * Creates daily key in format: "tenantId_userId_YYYY-MM-DD"
11
+ * Creates user key in format: "tenantId_userId"
12
12
  * Normalizes null/undefined tenantId to "default-tenant"
13
13
  */
14
+ private createUserKey;
15
+ /**
16
+ * @deprecated Use createUserKey instead
17
+ */
14
18
  private createDailyKey;
15
19
  /**
16
20
  * Gets start of day (00:00:00) for given date
17
21
  */
18
22
  private getStartOfDay;
23
+ /**
24
+ * Gets date string in format YYYY-MM-DD
25
+ */
26
+ private getDateString;
19
27
  /**
20
28
  * Start a new session - creates/updates daily summary + creates session detail
21
29
  */
@@ -53,21 +61,22 @@ export declare class DailySessionSummaryRepository extends BaseRepository<DailyS
53
61
  */
54
62
  recordHeartbeat(sessionId: string): Promise<SessionDetail | null>;
55
63
  /**
56
- * List daily session summaries with filters, search, and pagination
64
+ * List user session summaries with filters, search, and pagination
65
+ * Returns ONE record per user (not per day!)
57
66
  */
58
67
  list(query: SessionLogListQuery): Promise<ListResult<any>>;
59
68
  /**
60
- * Get session details for a specific daily summary
69
+ * Get session details for a specific user summary
61
70
  */
62
- getSessionDetails(dailySummaryId: string): Promise<SessionDetail[]>;
71
+ getSessionDetails(userSummaryId: string): Promise<SessionDetail[]>;
63
72
  /**
64
73
  * Get session detail by sessionId
65
74
  */
66
75
  getSessionDetailBySessionId(sessionId: string): Promise<SessionDetail | null>;
67
76
  /**
68
- * Get user sessions for date range
77
+ * Get user sessions - returns the single master record for the user
69
78
  */
70
- getUserSessions(userId: string, dateRange: DateRange): Promise<DailySessionSummary[]>;
79
+ getUserSessions(userId: string, dateRange?: DateRange): Promise<DailySessionSummary[]>;
71
80
  /**
72
81
  * Get active sessions for a user (regardless of date)
73
82
  */
@@ -1 +1 @@
1
- {"version":3,"file":"DailySessionSummaryRepository.d.ts","sourceRoot":"","sources":["../../../src/backend/repositories/DailySessionSummaryRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,aAAa,EAGd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhF,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,OAAO,CAAC,uBAAuB,CAAC;IAChC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiB;gBAE5C,EAAE,EAAE,EAAE;YAMJ,aAAa;IAwB3B;;;OAGG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,WAAW,CAAC,EAAE,GAAG,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IAmNpE;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAM,GAAG,SAAS,GAAG,OAAgB,GAC5C,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;IA2FjF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwF1F;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiCvE;;OAEG;IACG,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IA8ChE;;OAEG;IACG,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAOzE;;OAEG;IACG,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAInF;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAU3F;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAmBrF;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA4D/B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,UAAU;CAGnB"}
1
+ {"version":3,"file":"DailySessionSummaryRepository.d.ts","sourceRoot":"","sources":["../../../src/backend/repositories/DailySessionSummaryRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAiB,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EACL,mBAAmB,EACnB,aAAa,EAGd,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhF,qBAAa,6BAA8B,SAAQ,cAAc,CAAC,mBAAmB,CAAC;IACpF,OAAO,CAAC,uBAAuB,CAA+B;IAC9D,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAiB;gBAE5C,EAAE,EAAE,EAAE;YAMJ,aAAa;IAwB3B;;;OAGG;IACH,OAAO,CAAC,aAAa;IAKrB;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,aAAa;IAMrB;;OAEG;IACH,OAAO,CAAC,aAAa;IAIrB;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,IAAI,CAAC;QAChB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,WAAW,CAAC,EAAE,GAAG,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KAChC,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,CAAC;QAAC,MAAM,EAAE,aAAa,CAAA;KAAE,CAAC;IAwOpE;;OAEG;IACG,UAAU,CACd,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,MAAM,GAAG,SAAS,GAAG,OAAgB,GAC5C,OAAO,CAAC;QAAE,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;QAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAAA;KAAE,CAAC;IAiGjF;;OAEG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAwF1F;;OAEG;IACG,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAiCvE;;;OAGG;IACG,IAAI,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IA+ChE;;OAEG;IACG,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAOxE;;OAEG;IACG,2BAA2B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAInF;;OAEG;IACG,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAc5F;;OAEG;IACG,wBAAwB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAmBrF;;OAEG;IACH,OAAO,CAAC,uBAAuB;IA6D/B,OAAO,CAAC,uBAAuB;IAe/B,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,UAAU;CAGnB"}