@powersync/service-module-mongodb-storage 0.0.0-dev-20250812070033 → 0.0.0-dev-20250813080357
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 +9 -7
- package/dist/storage/MongoReportStorage.d.ts +0 -2
- package/dist/storage/MongoReportStorage.js +8 -68
- package/dist/storage/MongoReportStorage.js.map +1 -1
- package/package.json +8 -8
- package/src/storage/MongoReportStorage.ts +8 -70
- package/test/src/__snapshots__/sdk-report-storage.test.ts.snap +12 -2
- package/test/src/sdk-report-storage.test.ts +13 -13
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
# @powersync/service-module-mongodb-storage
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250813080357
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
7
|
- f1d187b: sdk reporting
|
|
8
|
+
- 0fad466: Added sdk reporting to storage
|
|
8
9
|
- a700ec9: Reporting mongo storage added to storage engine.
|
|
9
10
|
- 060b829: Update license abbreviation to FSL-1.1-ALv2.
|
|
10
11
|
- Updated dependencies [f1d187b]
|
|
12
|
+
- Updated dependencies [0fad466]
|
|
11
13
|
- Updated dependencies [a700ec9]
|
|
12
14
|
- Updated dependencies [060b829]
|
|
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/service-sync-rules@0.0.0-dev-
|
|
17
|
-
- @powersync/lib-service-mongodb@0.0.0-dev-
|
|
18
|
-
- @powersync/service-jsonbig@0.0.0-dev-
|
|
15
|
+
- @powersync/service-core@0.0.0-dev-20250813080357
|
|
16
|
+
- @powersync/service-types@0.0.0-dev-20250813080357
|
|
17
|
+
- @powersync/lib-services-framework@0.0.0-dev-20250813080357
|
|
18
|
+
- @powersync/service-sync-rules@0.0.0-dev-20250813080357
|
|
19
|
+
- @powersync/lib-service-mongodb@0.0.0-dev-20250813080357
|
|
20
|
+
- @powersync/service-jsonbig@0.0.0-dev-20250813080357
|
|
19
21
|
|
|
20
22
|
## 0.11.0
|
|
21
23
|
|
|
@@ -10,8 +10,6 @@ export declare class MongoReportStorage implements storage.ReportStorageFactory
|
|
|
10
10
|
private sdkProjectPipeline;
|
|
11
11
|
private updateDocFilter;
|
|
12
12
|
private listConnectionsDateRange;
|
|
13
|
-
private timeFrameQuery;
|
|
14
|
-
private timeFrameDeleteQuery;
|
|
15
13
|
deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void>;
|
|
16
14
|
scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnections>;
|
|
17
15
|
reportSdkConnect(data: event_types.SdkConnectBucketData): Promise<void>;
|
|
@@ -84,92 +84,32 @@ export class MongoReportStorage {
|
|
|
84
84
|
if (!range) {
|
|
85
85
|
return undefined;
|
|
86
86
|
}
|
|
87
|
-
const endDate = data.range?.
|
|
88
|
-
const startDate = new Date(range.
|
|
87
|
+
const endDate = data.range?.end ? new Date(data.range.end) : new Date();
|
|
88
|
+
const startDate = new Date(range.start);
|
|
89
89
|
return {
|
|
90
90
|
connect_at: {
|
|
91
91
|
$lte: endDate,
|
|
92
|
-
$
|
|
92
|
+
$gte: startDate
|
|
93
93
|
}
|
|
94
94
|
};
|
|
95
95
|
}
|
|
96
|
-
timeFrameQuery(timeframe, interval = 1) {
|
|
97
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
98
|
-
switch (timeframe) {
|
|
99
|
-
case 'month': {
|
|
100
|
-
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() - interval) };
|
|
101
|
-
}
|
|
102
|
-
case 'week': {
|
|
103
|
-
const weekStartDate = new Date(parsedDate);
|
|
104
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
105
|
-
const weekStart = this.parseJsDate(weekStartDate);
|
|
106
|
-
return {
|
|
107
|
-
$lte: parsedDate,
|
|
108
|
-
$gt: new Date(weekStart.year, weekStart.month, weekStart.today)
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
case 'hour': {
|
|
112
|
-
// Get the last hour from the current time
|
|
113
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
114
|
-
return {
|
|
115
|
-
$gt: new Date(year, month, today, previousHour),
|
|
116
|
-
$lte: new Date(year, month, today, parsedDate.getHours())
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
default: {
|
|
120
|
-
return {
|
|
121
|
-
$lte: parsedDate,
|
|
122
|
-
$gt: new Date(year, month, today - interval)
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
timeFrameDeleteQuery(timeframe, interval = 1) {
|
|
128
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
129
|
-
switch (timeframe) {
|
|
130
|
-
case 'month': {
|
|
131
|
-
return { $lt: new Date(year, parsedDate.getMonth() - interval) };
|
|
132
|
-
}
|
|
133
|
-
case 'week': {
|
|
134
|
-
const weekStartDate = new Date(parsedDate);
|
|
135
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
136
|
-
const { month, year, today } = this.parseJsDate(weekStartDate);
|
|
137
|
-
return {
|
|
138
|
-
$lt: new Date(year, month, today)
|
|
139
|
-
};
|
|
140
|
-
}
|
|
141
|
-
case 'hour': {
|
|
142
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
143
|
-
return {
|
|
144
|
-
$lt: new Date(year, month, today, previousHour)
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
default: {
|
|
148
|
-
return {
|
|
149
|
-
$lt: new Date(year, month, today - interval)
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
96
|
async deleteOldSdkData(data) {
|
|
155
|
-
const {
|
|
156
|
-
const timeframeFilter = this.timeFrameDeleteQuery(timeframe, interval);
|
|
97
|
+
const { date } = data;
|
|
157
98
|
const result = await this.db.sdk_report_events.deleteMany({
|
|
158
|
-
connect_at:
|
|
99
|
+
connect_at: { $lt: date },
|
|
159
100
|
$or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
|
|
160
101
|
});
|
|
161
102
|
if (result.deletedCount > 0) {
|
|
162
|
-
logger.info(`TTL ${
|
|
103
|
+
logger.info(`TTL from ${date.toISOString()}: ${result.deletedCount} MongoDB documents have been removed from sdk_report_events.`);
|
|
163
104
|
}
|
|
164
105
|
}
|
|
165
106
|
async scrapeSdkData(data) {
|
|
166
|
-
const {
|
|
167
|
-
const timeframeFilter = this.timeFrameQuery(timeframe, interval);
|
|
107
|
+
const { start, end } = data;
|
|
168
108
|
const result = await this.db.sdk_report_events
|
|
169
109
|
.aggregate([
|
|
170
110
|
{
|
|
171
111
|
$match: {
|
|
172
|
-
connect_at:
|
|
112
|
+
connect_at: { $lte: end, $gte: start }
|
|
173
113
|
}
|
|
174
114
|
},
|
|
175
115
|
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;AAE3D,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,WAAW,CAAC,IAAU;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,OAAO;YACL,IAAI;YACJ,KAAK;YACL,KAAK;YACL,GAAG;YACH,UAAU,EAAE,IAAI;SACjB,CAAC;IACJ,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;oBACD;wBACE,KAAK,EAAE;4BACL,GAAG,EAAE,CAAC;yBACP;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,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC5D,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,wBAAwB,CAAC,IAA+C;QAC9E,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,
|
|
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-20250813080357",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"license": "FSL-1.1-ALv2",
|
|
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-
|
|
34
|
-
"@powersync/service-jsonbig": "0.0.0-dev-
|
|
35
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
30
|
+
"@powersync/lib-service-mongodb": "0.0.0-dev-20250813080357",
|
|
31
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20250813080357",
|
|
32
|
+
"@powersync/service-core": "0.0.0-dev-20250813080357",
|
|
33
|
+
"@powersync/service-types": "0.0.0-dev-20250813080357",
|
|
34
|
+
"@powersync/service-jsonbig": "0.0.0-dev-20250813080357",
|
|
35
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20250813080357"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
38
|
+
"@powersync/service-core-tests": "0.0.0-dev-20250813080357"
|
|
39
39
|
},
|
|
40
40
|
"scripts": {
|
|
41
41
|
"build": "tsc -b",
|
|
@@ -95,98 +95,36 @@ export class MongoReportStorage implements storage.ReportStorageFactory {
|
|
|
95
95
|
if (!range) {
|
|
96
96
|
return undefined;
|
|
97
97
|
}
|
|
98
|
-
const endDate = data.range?.
|
|
99
|
-
const startDate = new Date(range.
|
|
98
|
+
const endDate = data.range?.end ? new Date(data.range.end) : new Date();
|
|
99
|
+
const startDate = new Date(range.start);
|
|
100
100
|
return {
|
|
101
101
|
connect_at: {
|
|
102
102
|
$lte: endDate,
|
|
103
|
-
$
|
|
103
|
+
$gte: startDate
|
|
104
104
|
}
|
|
105
105
|
};
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
-
private timeFrameQuery(timeframe: event_types.TimeFrames, interval: number = 1): mongo.Filter<mongo.Document> {
|
|
109
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
110
|
-
switch (timeframe) {
|
|
111
|
-
case 'month': {
|
|
112
|
-
return { $lte: parsedDate, $gt: new Date(year, parsedDate.getMonth() - interval) };
|
|
113
|
-
}
|
|
114
|
-
case 'week': {
|
|
115
|
-
const weekStartDate = new Date(parsedDate);
|
|
116
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
117
|
-
const weekStart = this.parseJsDate(weekStartDate);
|
|
118
|
-
return {
|
|
119
|
-
$lte: parsedDate,
|
|
120
|
-
$gt: new Date(weekStart.year, weekStart.month, weekStart.today)
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
case 'hour': {
|
|
124
|
-
// Get the last hour from the current time
|
|
125
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
126
|
-
return {
|
|
127
|
-
$gt: new Date(year, month, today, previousHour),
|
|
128
|
-
$lte: new Date(year, month, today, parsedDate.getHours())
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
default: {
|
|
132
|
-
return {
|
|
133
|
-
$lte: parsedDate,
|
|
134
|
-
$gt: new Date(year, month, today - interval)
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private timeFrameDeleteQuery(timeframe: event_types.TimeFrames, interval: number = 1): mongo.Filter<mongo.Document> {
|
|
141
|
-
const { year, month, today, parsedDate } = this.parseJsDate(new Date());
|
|
142
|
-
switch (timeframe) {
|
|
143
|
-
case 'month': {
|
|
144
|
-
return { $lt: new Date(year, parsedDate.getMonth() - interval) };
|
|
145
|
-
}
|
|
146
|
-
case 'week': {
|
|
147
|
-
const weekStartDate = new Date(parsedDate);
|
|
148
|
-
weekStartDate.setDate(weekStartDate.getDate() - 6 * interval);
|
|
149
|
-
const { month, year, today } = this.parseJsDate(weekStartDate);
|
|
150
|
-
return {
|
|
151
|
-
$lt: new Date(year, month, today)
|
|
152
|
-
};
|
|
153
|
-
}
|
|
154
|
-
case 'hour': {
|
|
155
|
-
const previousHour = parsedDate.getHours() - interval;
|
|
156
|
-
return {
|
|
157
|
-
$lt: new Date(year, month, today, previousHour)
|
|
158
|
-
};
|
|
159
|
-
}
|
|
160
|
-
default: {
|
|
161
|
-
return {
|
|
162
|
-
$lt: new Date(year, month, today - interval)
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
108
|
async deleteOldSdkData(data: event_types.DeleteOldSdkData): Promise<void> {
|
|
169
|
-
const {
|
|
170
|
-
const timeframeFilter = this.timeFrameDeleteQuery(timeframe, interval);
|
|
109
|
+
const { date } = data;
|
|
171
110
|
const result = await this.db.sdk_report_events.deleteMany({
|
|
172
|
-
connect_at:
|
|
111
|
+
connect_at: { $lt: date },
|
|
173
112
|
$or: [{ disconnect_at: { $exists: true } }, { jwt_exp: { $lt: new Date() }, disconnect_at: { $exists: false } }]
|
|
174
113
|
});
|
|
175
114
|
if (result.deletedCount > 0) {
|
|
176
115
|
logger.info(
|
|
177
|
-
`TTL ${
|
|
116
|
+
`TTL from ${date.toISOString()}: ${result.deletedCount} MongoDB documents have been removed from sdk_report_events.`
|
|
178
117
|
);
|
|
179
118
|
}
|
|
180
119
|
}
|
|
181
120
|
|
|
182
121
|
async scrapeSdkData(data: event_types.ScrapeSdkDataRequest): Promise<event_types.ListCurrentConnections> {
|
|
183
|
-
const {
|
|
184
|
-
const timeframeFilter = this.timeFrameQuery(timeframe, interval);
|
|
122
|
+
const { start, end } = data;
|
|
185
123
|
const result = await this.db.sdk_report_events
|
|
186
124
|
.aggregate<event_types.ListCurrentConnections>([
|
|
187
125
|
{
|
|
188
126
|
$match: {
|
|
189
|
-
connect_at:
|
|
127
|
+
connect_at: { $lte: end, $gte: start }
|
|
190
128
|
}
|
|
191
129
|
},
|
|
192
130
|
this.sdkFacetPipeline(),
|
|
@@ -40,8 +40,13 @@ exports[`SDK reporting storage > Should delete rows older than specified range 1
|
|
|
40
40
|
"sdk": "powersync-js/1.21.4",
|
|
41
41
|
"users": 1,
|
|
42
42
|
},
|
|
43
|
+
{
|
|
44
|
+
"clients": 1,
|
|
45
|
+
"sdk": "powersync-js/1.24.5",
|
|
46
|
+
"users": 1,
|
|
47
|
+
},
|
|
43
48
|
],
|
|
44
|
-
"users":
|
|
49
|
+
"users": 5,
|
|
45
50
|
}
|
|
46
51
|
`;
|
|
47
52
|
|
|
@@ -134,8 +139,13 @@ exports[`SDK reporting storage > Should show SDK scrape data for user over the p
|
|
|
134
139
|
"sdk": "powersync-js/1.21.4",
|
|
135
140
|
"users": 1,
|
|
136
141
|
},
|
|
142
|
+
{
|
|
143
|
+
"clients": 1,
|
|
144
|
+
"sdk": "powersync-js/1.24.5",
|
|
145
|
+
"users": 1,
|
|
146
|
+
},
|
|
137
147
|
],
|
|
138
|
-
"users":
|
|
148
|
+
"users": 5,
|
|
139
149
|
}
|
|
140
150
|
`;
|
|
141
151
|
|
|
@@ -30,6 +30,7 @@ describe('SDK reporting storage', async () => {
|
|
|
30
30
|
now.getHours(),
|
|
31
31
|
now.getMinutes() - 5
|
|
32
32
|
);
|
|
33
|
+
const dayAgo = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1, now.getHours());
|
|
33
34
|
const yesterday = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1);
|
|
34
35
|
const weekAgo = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 7);
|
|
35
36
|
const monthAgo = new Date(now.getFullYear(), now.getMonth() - 1, now.getDate());
|
|
@@ -120,7 +121,7 @@ describe('SDK reporting storage', async () => {
|
|
|
120
121
|
it('Should show connected users with start range', async () => {
|
|
121
122
|
const current = await factory.listCurrentConnections({
|
|
122
123
|
range: {
|
|
123
|
-
|
|
124
|
+
start: new Date(
|
|
124
125
|
now.getFullYear(),
|
|
125
126
|
now.getMonth(),
|
|
126
127
|
now.getDate(),
|
|
@@ -134,8 +135,8 @@ describe('SDK reporting storage', async () => {
|
|
|
134
135
|
it('Should show connected users with start range and end range', async () => {
|
|
135
136
|
const current = await factory.listCurrentConnections({
|
|
136
137
|
range: {
|
|
137
|
-
|
|
138
|
-
|
|
138
|
+
end: nowLess5minutes.toISOString(),
|
|
139
|
+
start: new Date(
|
|
139
140
|
now.getFullYear(),
|
|
140
141
|
now.getMonth(),
|
|
141
142
|
now.getDate(),
|
|
@@ -148,22 +149,22 @@ describe('SDK reporting storage', async () => {
|
|
|
148
149
|
});
|
|
149
150
|
it('Should show SDK scrape data for user over the past month', async () => {
|
|
150
151
|
const sdk = await factory.scrapeSdkData({
|
|
151
|
-
|
|
152
|
-
|
|
152
|
+
start: monthAgo,
|
|
153
|
+
end: now
|
|
153
154
|
});
|
|
154
155
|
expect(sdk).toMatchSnapshot();
|
|
155
156
|
});
|
|
156
157
|
it('Should show SDK scrape data for user over the past week', async () => {
|
|
157
158
|
const sdk = await factory.scrapeSdkData({
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
start: weekAgo,
|
|
160
|
+
end: now
|
|
160
161
|
});
|
|
161
162
|
expect(sdk).toMatchSnapshot();
|
|
162
163
|
});
|
|
163
164
|
it('Should show SDK scrape data for user over the past day', async () => {
|
|
164
165
|
const sdk = await factory.scrapeSdkData({
|
|
165
|
-
|
|
166
|
-
|
|
166
|
+
start: dayAgo,
|
|
167
|
+
end: now
|
|
167
168
|
});
|
|
168
169
|
expect(sdk).toMatchSnapshot();
|
|
169
170
|
});
|
|
@@ -244,12 +245,11 @@ describe('SDK reporting storage', async () => {
|
|
|
244
245
|
await deleteData();
|
|
245
246
|
await loadData();
|
|
246
247
|
await factory.deleteOldSdkData({
|
|
247
|
-
|
|
248
|
-
timeframe: 'week'
|
|
248
|
+
date: weekAgo
|
|
249
249
|
});
|
|
250
250
|
const sdk = await factory.scrapeSdkData({
|
|
251
|
-
|
|
252
|
-
|
|
251
|
+
start: monthAgo,
|
|
252
|
+
end: now
|
|
253
253
|
});
|
|
254
254
|
expect(sdk).toMatchSnapshot();
|
|
255
255
|
});
|