@powersync/service-module-mongodb-storage 0.0.0-dev-20250723144115 → 0.0.0-dev-20250724091220
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5 -5
- package/dist/migrations/db/migrations/1752661449910-sdk-reporting.js +5 -4
- package/dist/migrations/db/migrations/1752661449910-sdk-reporting.js.map +1 -1
- package/dist/storage/MongoReportStorage.d.ts +3 -2
- package/dist/storage/MongoReportStorage.js +60 -18
- package/dist/storage/MongoReportStorage.js.map +1 -1
- package/package.json +6 -6
- package/src/migrations/db/migrations/1752661449910-sdk-reporting.ts +8 -4
- package/src/storage/MongoReportStorage.ts +61 -18
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @powersync/service-module-mongodb-storage
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250724091220
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
@@ -10,10 +10,10 @@
|
|
|
10
10
|
- Updated dependencies [4ebc3bf]
|
|
11
11
|
- Updated dependencies [1aafdaf]
|
|
12
12
|
- Updated dependencies [a700ec9]
|
|
13
|
-
- @powersync/service-core@0.0.0-dev-
|
|
14
|
-
- @powersync/service-types@0.0.0-dev-
|
|
15
|
-
- @powersync/lib-services-framework@0.0.0-dev-
|
|
16
|
-
- @powersync/lib-service-mongodb@0.0.0-dev-
|
|
13
|
+
- @powersync/service-core@0.0.0-dev-20250724091220
|
|
14
|
+
- @powersync/service-types@0.0.0-dev-20250724091220
|
|
15
|
+
- @powersync/lib-services-framework@0.0.0-dev-20250724091220
|
|
16
|
+
- @powersync/lib-service-mongodb@0.0.0-dev-20250724091220
|
|
17
17
|
|
|
18
18
|
## 0.10.4
|
|
19
19
|
|
|
@@ -8,15 +8,16 @@ export const up = async (context) => {
|
|
|
8
8
|
connect_at: 1,
|
|
9
9
|
jwt_exp: 1,
|
|
10
10
|
disconnect_at: 1
|
|
11
|
-
}, { name: '
|
|
11
|
+
}, { name: 'list_index' });
|
|
12
12
|
await db.sdk_report_events.createIndex({
|
|
13
|
-
user_id: 1
|
|
14
|
-
sdk: 1,
|
|
15
|
-
version: 1
|
|
13
|
+
user_id: 1
|
|
16
14
|
}, { name: 'user_id' });
|
|
17
15
|
await db.sdk_report_events.createIndex({
|
|
18
16
|
client_id: 1
|
|
19
17
|
}, { name: 'client_id' });
|
|
18
|
+
await db.sdk_report_events.createIndex({
|
|
19
|
+
sdk: 1
|
|
20
|
+
}, { name: 'sdk' });
|
|
20
21
|
}
|
|
21
22
|
finally {
|
|
22
23
|
await db.client.close();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"1752661449910-sdk-reporting.js","sourceRoot":"","sources":["../../../../src/migrations/db/migrations/1752661449910-sdk-reporting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,mCAAmC,CAAC;AAG7D,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;IACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAA6B,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,4BAA4B,EAAE,CAAC;QAExC,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,aAAa,EAAE,CAAC;SACjB,EACD,EAAE,IAAI,EAAE,YAAY,EAAE,CACvB,CAAC;QAEF,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,OAAO,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"1752661449910-sdk-reporting.js","sourceRoot":"","sources":["../../../../src/migrations/db/migrations/1752661449910-sdk-reporting.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,mCAAmC,CAAC;AAG7D,MAAM,CAAC,MAAM,EAAE,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;IACzE,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;IACZ,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAA6B,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,4BAA4B,EAAE,CAAC;QAExC,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,CAAC;YACV,aAAa,EAAE,CAAC;SACjB,EACD,EAAE,IAAI,EAAE,YAAY,EAAE,CACvB,CAAC;QAEF,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,OAAO,EAAE,CAAC;SACX,EACD,EAAE,IAAI,EAAE,SAAS,EAAE,CACpB,CAAC;QACF,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,SAAS,EAAE,CAAC;SACb,EACD,EAAE,IAAI,EAAE,WAAW,EAAE,CACtB,CAAC;QACF,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CACpC;YACE,GAAG,EAAE,CAAC;SACP,EACD,EAAE,IAAI,EAAE,KAAK,EAAE,CAChB,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAA0C,KAAK,EAAE,OAAO,EAAE,EAAE;IAC3E,MAAM,EACJ,eAAe,EAAE,EAAE,aAAa,EAAE,EACnC,GAAG,OAAO,CAAC;IAEZ,MAAM,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,aAAa,CAAC,OAA6B,CAAC,CAAC;IAErF,IAAI,CAAC;QACH,IAAI,MAAM,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,MAAM,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,MAAM,EAAE,CAAC,wBAAwB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC7D,MAAM,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACzD,CAAC;QACD,IAAI,MAAM,EAAE,CAAC,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/D,MAAM,EAAE,CAAC,wBAAwB,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,EAAE,CAAC,EAAE,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;IAClD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC1B,CAAC;AACH,CAAC,CAAC"}
|
|
@@ -8,8 +8,9 @@ export declare class MongoReportStorage implements storage.ReportStorageFactory
|
|
|
8
8
|
private sdkFacetPipeline;
|
|
9
9
|
private sdkProjectPipeline;
|
|
10
10
|
private updateDocFilter;
|
|
11
|
-
private
|
|
12
|
-
private
|
|
11
|
+
private listConnectionsDateRange;
|
|
12
|
+
private timeFrameQuery;
|
|
13
|
+
private timeFrameDeleteQuery;
|
|
13
14
|
deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void>;
|
|
14
15
|
scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnections>;
|
|
15
16
|
reportSdkConnect(data: event_types.SdkConnectBucketData): Promise<void>;
|
|
@@ -75,7 +75,7 @@ export class MongoReportStorage {
|
|
|
75
75
|
}
|
|
76
76
|
};
|
|
77
77
|
}
|
|
78
|
-
|
|
78
|
+
listConnectionsDateRange(data) {
|
|
79
79
|
const { range } = data;
|
|
80
80
|
if (!range) {
|
|
81
81
|
return undefined;
|
|
@@ -86,21 +86,19 @@ export class MongoReportStorage {
|
|
|
86
86
|
throw new Error('Invalid start date for `day` period. Max period is withing 2 days');
|
|
87
87
|
}
|
|
88
88
|
return {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
$gt: parsedDate
|
|
92
|
-
}
|
|
89
|
+
$lte: date,
|
|
90
|
+
$gt: parsedDate
|
|
93
91
|
};
|
|
94
92
|
}
|
|
95
|
-
|
|
93
|
+
timeFrameQuery(timeframe, interval = 1) {
|
|
96
94
|
const { year, month, today, parsedDate } = parseJsDate(new Date());
|
|
97
|
-
switch (
|
|
95
|
+
switch (timeframe) {
|
|
98
96
|
case 'month': {
|
|
99
|
-
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() -
|
|
97
|
+
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() - interval) };
|
|
100
98
|
}
|
|
101
99
|
case 'week': {
|
|
102
100
|
const weekStartDate = new Date(parsedDate);
|
|
103
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 *
|
|
101
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
104
102
|
const weekStart = parseJsDate(weekStartDate);
|
|
105
103
|
return {
|
|
106
104
|
$lte: parsedDate,
|
|
@@ -109,24 +107,52 @@ export class MongoReportStorage {
|
|
|
109
107
|
}
|
|
110
108
|
case 'hour': {
|
|
111
109
|
// Get the last hour from the current time
|
|
112
|
-
const previousHour = parsedDate.getHours() -
|
|
110
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
113
111
|
return {
|
|
114
|
-
$
|
|
115
|
-
$
|
|
112
|
+
$gt: new Date(year, month, today, previousHour),
|
|
113
|
+
$lte: new Date(year, month, today, parsedDate.getHours())
|
|
116
114
|
};
|
|
117
115
|
}
|
|
118
116
|
default: {
|
|
119
117
|
return {
|
|
120
118
|
$lte: parsedDate,
|
|
121
|
-
$gt: new Date(year, month, today -
|
|
119
|
+
$gt: new Date(year, month, today - interval)
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
timeFrameDeleteQuery(timeframe, interval = 1) {
|
|
125
|
+
const { year, month, today, parsedDate } = parseJsDate(new Date());
|
|
126
|
+
switch (timeframe) {
|
|
127
|
+
case 'month': {
|
|
128
|
+
return { $lt: new Date(year, parsedDate.getMonth() - interval) };
|
|
129
|
+
}
|
|
130
|
+
case 'week': {
|
|
131
|
+
const weekStartDate = new Date(parsedDate);
|
|
132
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
133
|
+
const { month, year, today } = parseJsDate(weekStartDate);
|
|
134
|
+
return {
|
|
135
|
+
$lt: new Date(year, month, today)
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
case 'hour': {
|
|
139
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
140
|
+
return {
|
|
141
|
+
$lt: new Date(year, month, today, previousHour)
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
default: {
|
|
145
|
+
return {
|
|
146
|
+
$lt: new Date(year, month, today - interval)
|
|
122
147
|
};
|
|
123
148
|
}
|
|
124
149
|
}
|
|
125
150
|
}
|
|
126
151
|
async deleteOldSdkData(data) {
|
|
127
|
-
const {
|
|
152
|
+
const { interval, timeframe } = data;
|
|
153
|
+
const timeframeFilter = this.timeFrameDeleteQuery(timeframe, interval);
|
|
128
154
|
const result = await this.db.sdk_report_events.deleteMany({
|
|
129
|
-
connect_at:
|
|
155
|
+
connect_at: timeframeFilter,
|
|
130
156
|
$or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
|
|
131
157
|
});
|
|
132
158
|
if (result.deletedCount > 0) {
|
|
@@ -134,12 +160,13 @@ export class MongoReportStorage {
|
|
|
134
160
|
}
|
|
135
161
|
}
|
|
136
162
|
async scrapeSdkData(data) {
|
|
137
|
-
const
|
|
163
|
+
const { interval, timeframe } = data;
|
|
164
|
+
const timeframeFilter = this.timeFrameQuery(timeframe, interval);
|
|
138
165
|
const result = await this.db.sdk_report_events
|
|
139
166
|
.aggregate([
|
|
140
167
|
{
|
|
141
168
|
$match: {
|
|
142
|
-
connect_at:
|
|
169
|
+
connect_at: timeframeFilter
|
|
143
170
|
}
|
|
144
171
|
},
|
|
145
172
|
this.sdkFacetPipeline(),
|
|
@@ -171,13 +198,28 @@ export class MongoReportStorage {
|
|
|
171
198
|
});
|
|
172
199
|
}
|
|
173
200
|
async listCurrentConnections(data) {
|
|
201
|
+
const timeframeFilter = this.listConnectionsDateRange(data);
|
|
202
|
+
const explain = await this.db.sdk_report_events
|
|
203
|
+
.aggregate([
|
|
204
|
+
{
|
|
205
|
+
$match: {
|
|
206
|
+
disconnect_at: { $exists: false },
|
|
207
|
+
jwt_exp: { $gt: new Date() },
|
|
208
|
+
connect_at: timeframeFilter
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
this.sdkFacetPipeline(),
|
|
212
|
+
this.sdkProjectPipeline()
|
|
213
|
+
])
|
|
214
|
+
.explain();
|
|
215
|
+
console.log(explain);
|
|
174
216
|
const result = await this.db.sdk_report_events
|
|
175
217
|
.aggregate([
|
|
176
218
|
{
|
|
177
219
|
$match: {
|
|
178
220
|
disconnect_at: { $exists: false },
|
|
179
221
|
jwt_exp: { $gt: new Date() },
|
|
180
|
-
|
|
222
|
+
connect_at: timeframeFilter
|
|
181
223
|
}
|
|
182
224
|
},
|
|
183
225
|
this.sdkFacetPipeline(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,SAAS,SAAS,CAAC,IAAU;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;IAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1B,OAAO;QACL,IAAI;QACJ,KAAK;QACL,KAAK;QACL,GAAG;QACH,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kBAAkB;IACZ,MAAM,CAAoB;IAC3B,EAAE,CAAiB;IAEnC,YAAY,EAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAEO,gBAAgB;QACtB,OAAO;YACL,MAAM,EAAE;gBACN,YAAY,EAAE;oBACZ;wBACE,MAAM,EAAE;4BACN,GAAG,EAAE,UAAU;yBAChB;qBACF;oBACD;wBACE,MAAM,EAAE,OAAO;qBAChB;iBACF;gBACD,kBAAkB,EAAE;oBAClB;wBACE,MAAM,EAAE;4BACN,GAAG,EAAE,MAAM;4BACX,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE;4BAClB,UAAU,EAAE,EAAE,SAAS,EAAE,YAAY,EAAE;4BACvC,QAAQ,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE;yBACpC;qBACF;oBACD;wBACE,QAAQ,EAAE;4BACR,GAAG,EAAE,CAAC;4BACN,GAAG,EAAE,MAAM;4BACX,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;4BAC7B,OAAO,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;yBAClC;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,OAAO;YACL,QAAQ,EAAE;gBACR,KAAK,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,qBAAqB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;gBACrE,IAAI,EAAE,qBAAqB;aAC5B;SACF,CAAC;IACJ,CAAC;IAEO,eAAe,CAAC,MAAc,EAAE,QAAgB;QACtD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;QAC1B,OAAO;YACL,OAAO,EAAE,MAAM;YACf,SAAS,EAAE,QAAQ;YACnB,UAAU,EAAE;gBACV,8DAA8D;gBAC9D,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;gBAClC,GAAG,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC;aACpC;SACF,CAAC;IACJ,CAAC;IAEO,
|
|
1
|
+
{"version":3,"file":"MongoReportStorage.js","sourceRoot":"","sources":["../../src/storage/MongoReportStorage.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@powersync/service-module-mongodb-storage",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
4
|
"types": "dist/index.d.ts",
|
|
5
|
-
"version": "0.0.0-dev-
|
|
5
|
+
"version": "0.0.0-dev-20250724091220",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"license": "FSL-1.1-Apache-2.0",
|
|
8
8
|
"type": "module",
|
|
@@ -27,15 +27,15 @@
|
|
|
27
27
|
"lru-cache": "^10.2.2",
|
|
28
28
|
"ts-codec": "^1.3.0",
|
|
29
29
|
"uuid": "^11.1.0",
|
|
30
|
-
"@powersync/lib-service-mongodb": "0.0.0-dev-
|
|
31
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
32
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
33
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
30
|
+
"@powersync/lib-service-mongodb": "0.0.0-dev-20250724091220",
|
|
31
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250724091220",
|
|
32
|
+
"@powersync/service-core": "0.0.0-dev-20250724091220",
|
|
33
|
+
"@powersync/service-types": "0.0.0-dev-20250724091220",
|
|
34
34
|
"@powersync/service-jsonbig": "0.17.10",
|
|
35
35
|
"@powersync/service-sync-rules": "0.27.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
38
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250724091220"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc -b",
|
|
@@ -17,14 +17,12 @@ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
|
17
17
|
jwt_exp: 1,
|
|
18
18
|
disconnect_at: 1
|
|
19
19
|
},
|
|
20
|
-
{ name: '
|
|
20
|
+
{ name: 'list_index' }
|
|
21
21
|
);
|
|
22
22
|
|
|
23
23
|
await db.sdk_report_events.createIndex(
|
|
24
24
|
{
|
|
25
|
-
user_id: 1
|
|
26
|
-
sdk: 1,
|
|
27
|
-
version: 1
|
|
25
|
+
user_id: 1
|
|
28
26
|
},
|
|
29
27
|
{ name: 'user_id' }
|
|
30
28
|
);
|
|
@@ -34,6 +32,12 @@ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
|
|
|
34
32
|
},
|
|
35
33
|
{ name: 'client_id' }
|
|
36
34
|
);
|
|
35
|
+
await db.sdk_report_events.createIndex(
|
|
36
|
+
{
|
|
37
|
+
sdk: 1
|
|
38
|
+
},
|
|
39
|
+
{ name: 'sdk' }
|
|
40
|
+
);
|
|
37
41
|
} finally {
|
|
38
42
|
await db.client.close();
|
|
39
43
|
}
|
|
@@ -86,7 +86,7 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
86
86
|
};
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
private
|
|
89
|
+
private listConnectionsDateRange(data: event_types.ListCurrentConnectionsRequest) {
|
|
90
90
|
const { range } = data;
|
|
91
91
|
if (!range) {
|
|
92
92
|
return undefined;
|
|
@@ -97,22 +97,20 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
97
97
|
throw new Error('Invalid start date for `day` period. Max period is withing 2 days');
|
|
98
98
|
}
|
|
99
99
|
return {
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
$gt: parsedDate
|
|
103
|
-
}
|
|
100
|
+
$lte: date,
|
|
101
|
+
$gt: parsedDate
|
|
104
102
|
};
|
|
105
103
|
}
|
|
106
104
|
|
|
107
|
-
private
|
|
105
|
+
private timeFrameQuery(timeframe: event_types.TimeFrames, interval: number = 1): mongo.Filter<mongo.Document> {
|
|
108
106
|
const { year, month, today, parsedDate } = parseJsDate(new Date());
|
|
109
|
-
switch (
|
|
107
|
+
switch (timeframe) {
|
|
110
108
|
case 'month': {
|
|
111
|
-
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() -
|
|
109
|
+
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() - interval) };
|
|
112
110
|
}
|
|
113
111
|
case 'week': {
|
|
114
112
|
const weekStartDate = new Date(parsedDate);
|
|
115
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 *
|
|
113
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
116
114
|
const weekStart = parseJsDate(weekStartDate);
|
|
117
115
|
return {
|
|
118
116
|
$lte: parsedDate,
|
|
@@ -121,25 +119,54 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
121
119
|
}
|
|
122
120
|
case 'hour': {
|
|
123
121
|
// Get the last hour from the current time
|
|
124
|
-
const previousHour = parsedDate.getHours() -
|
|
122
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
125
123
|
return {
|
|
126
|
-
$
|
|
127
|
-
$
|
|
124
|
+
$gt: new Date(year, month, today, previousHour),
|
|
125
|
+
$lte: new Date(year, month, today, parsedDate.getHours())
|
|
128
126
|
};
|
|
129
127
|
}
|
|
130
128
|
default: {
|
|
131
129
|
return {
|
|
132
130
|
$lte: parsedDate,
|
|
133
|
-
$gt: new Date(year, month, today -
|
|
131
|
+
$gt: new Date(year, month, today - interval)
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
private timeFrameDeleteQuery(timeframe: event_types.TimeFrames, interval: number = 1): mongo.Filter<mongo.Document> {
|
|
138
|
+
const { year, month, today, parsedDate } = parseJsDate(new Date());
|
|
139
|
+
switch (timeframe) {
|
|
140
|
+
case 'month': {
|
|
141
|
+
return { $lt: new Date(year, parsedDate.getMonth() - interval) };
|
|
142
|
+
}
|
|
143
|
+
case 'week': {
|
|
144
|
+
const weekStartDate = new Date(parsedDate);
|
|
145
|
+
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
146
|
+
const { month, year, today } = parseJsDate(weekStartDate);
|
|
147
|
+
return {
|
|
148
|
+
$lt: new Date(year, month, today)
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
case 'hour': {
|
|
152
|
+
const previousHour = parsedDate.getHours() - interval;
|
|
153
|
+
return {
|
|
154
|
+
$lt: new Date(year, month, today, previousHour)
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
default: {
|
|
158
|
+
return {
|
|
159
|
+
$lt: new Date(year, month, today - interval)
|
|
134
160
|
};
|
|
135
161
|
}
|
|
136
162
|
}
|
|
137
163
|
}
|
|
138
164
|
|
|
139
165
|
async deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void> {
|
|
140
|
-
const {
|
|
166
|
+
const { interval, timeframe } = data;
|
|
167
|
+
const timeframeFilter = this.timeFrameDeleteQuery(timeframe, interval);
|
|
141
168
|
const result = await this.db.sdk_report_events.deleteMany({
|
|
142
|
-
connect_at:
|
|
169
|
+
connect_at: timeframeFilter,
|
|
143
170
|
$or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
|
|
144
171
|
});
|
|
145
172
|
if (result.deletedCount > 0) {
|
|
@@ -148,12 +175,13 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
148
175
|
}
|
|
149
176
|
|
|
150
177
|
async scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnections> {
|
|
151
|
-
const
|
|
178
|
+
const { interval, timeframe } = data;
|
|
179
|
+
const timeframeFilter = this.timeFrameQuery(timeframe, interval);
|
|
152
180
|
const result = await this.db.sdk_report_events
|
|
153
181
|
.aggregate([
|
|
154
182
|
{
|
|
155
183
|
$match: {
|
|
156
|
-
connect_at:
|
|
184
|
+
connect_at: timeframeFilter
|
|
157
185
|
}
|
|
158
186
|
},
|
|
159
187
|
this.sdkFacetPipeline(),
|
|
@@ -192,13 +220,28 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
192
220
|
async listCurrentConnections(
|
|
193
221
|
data: event_types.ListCurrentConnectionsRequest
|
|
194
222
|
): Promise<event_types.ListCurrentConnections> {
|
|
223
|
+
const timeframeFilter = this.listConnectionsDateRange(data);
|
|
224
|
+
const explain = await this.db.sdk_report_events
|
|
225
|
+
.aggregate([
|
|
226
|
+
{
|
|
227
|
+
$match: {
|
|
228
|
+
disconnect_at: { $exists: false },
|
|
229
|
+
jwt_exp: { $gt: new Date() },
|
|
230
|
+
connect_at: timeframeFilter
|
|
231
|
+
}
|
|
232
|
+
},
|
|
233
|
+
this.sdkFacetPipeline(),
|
|
234
|
+
this.sdkProjectPipeline()
|
|
235
|
+
])
|
|
236
|
+
.explain();
|
|
237
|
+
console.log(explain);
|
|
195
238
|
const result = await this.db.sdk_report_events
|
|
196
239
|
.aggregate([
|
|
197
240
|
{
|
|
198
241
|
$match: {
|
|
199
242
|
disconnect_at: { $exists: false },
|
|
200
243
|
jwt_exp: { $gt: new Date() },
|
|
201
|
-
|
|
244
|
+
connect_at: timeframeFilter
|
|
202
245
|
}
|
|
203
246
|
},
|
|
204
247
|
this.sdkFacetPipeline(),
|