@seneris/nosework 0.1.0 → 0.2.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.
- package/README.md +28 -44
- package/dist/client.d.ts +9 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +26 -17
- package/dist/client.js.map +1 -1
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +123 -117
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/query.d.ts +0 -11
- package/dist/query.d.ts.map +1 -1
- package/dist/query.js +173 -212
- package/dist/query.js.map +1 -1
- package/dist/schema.d.ts +979 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +101 -0
- package/dist/schema.js.map +1 -0
- package/dist/track.d.ts.map +1 -1
- package/dist/track.js +27 -30
- package/dist/track.js.map +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +31 -22
- package/dist/utils.js.map +1 -1
- package/package.json +4 -9
- package/prisma/schema.prisma +0 -145
package/dist/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { trackPageView, trackEvent } from "./track.js";
|
|
2
2
|
export { trackError, getErrorStats, getErrorGroups, getErrorInstances, updateErrorGroupStatus, deleteOldErrors, } from "./error.js";
|
|
3
|
-
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries,
|
|
3
|
+
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries, getSessionStats, getEntryPages, getExitPages, getPageFlows, getSessions, } from "./query.js";
|
|
4
|
+
export * from "./schema.js";
|
|
4
5
|
export { getClient, disconnect } from "./client.js";
|
|
5
6
|
export { isBot, cleanupOldSalts } from "./utils.js";
|
|
6
7
|
export { parseUserAgent } from "./ua.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGvD,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa,EAEb,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAGpB,cAAc,aAAa,CAAC;AAG5B,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGpD,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAGzC,YAAY,EACV,oBAAoB,EACpB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,eAAe,EACf,WAAW,EAEX,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EAER,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,cAAc,EACd,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,9 +4,11 @@ export { trackPageView, trackEvent } from "./track.js";
|
|
|
4
4
|
// Error tracking functions
|
|
5
5
|
export { trackError, getErrorStats, getErrorGroups, getErrorInstances, updateErrorGroupStatus, deleteOldErrors, } from "./error.js";
|
|
6
6
|
// Query functions
|
|
7
|
-
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries,
|
|
7
|
+
export { getStats, getTopPages, getLocations, getReferrers, getDevices, getTimeSeries,
|
|
8
8
|
// Session analytics
|
|
9
9
|
getSessionStats, getEntryPages, getExitPages, getPageFlows, getSessions, } from "./query.js";
|
|
10
|
+
// Schema exports (for advanced use cases)
|
|
11
|
+
export * from "./schema.js";
|
|
10
12
|
// Client utilities
|
|
11
13
|
export { getClient, disconnect } from "./client.js";
|
|
12
14
|
// Utility functions
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,2BAA2B;AAC3B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C,qBAAqB;AACrB,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEvD,2BAA2B;AAC3B,OAAO,EACL,UAAU,EACV,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,sBAAsB,EACtB,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,kBAAkB;AAClB,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,aAAa;AACb,oBAAoB;AACpB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,MAAM,YAAY,CAAC;AAEpB,0CAA0C;AAC1C,cAAc,aAAa,CAAC;AAE5B,mBAAmB;AACnB,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpD,oBAAoB;AACpB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEpD,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/query.d.ts
CHANGED
|
@@ -34,15 +34,4 @@ export declare function getPageFlows(options: PaginatedQueryOptions & {
|
|
|
34
34
|
* Get individual session data (for debugging/analysis)
|
|
35
35
|
*/
|
|
36
36
|
export declare function getSessions(options: PaginatedQueryOptions): Promise<SessionData[]>;
|
|
37
|
-
export declare function getOrCreateSite(domain: string, name?: string): Promise<{
|
|
38
|
-
id: string;
|
|
39
|
-
name: string;
|
|
40
|
-
domain: string;
|
|
41
|
-
}>;
|
|
42
|
-
export declare function listSites(): Promise<{
|
|
43
|
-
id: string;
|
|
44
|
-
name: string;
|
|
45
|
-
domain: string;
|
|
46
|
-
createdAt: Date;
|
|
47
|
-
}[]>;
|
|
48
37
|
//# sourceMappingURL=query.d.ts.map
|
package/dist/query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,KAAK,EACL,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,aAAa,EACb,QAAQ,EACT,MAAM,YAAY,CAAC;AAWpB,wBAAsB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CA0CpE;AAED,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,OAAO,EAAE,CAAC,CAuBpB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CA0BzB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,YAAY,EAAE,CAAC,CAsBzB;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,UAAU,EAAE,CAAC,CA0BvB;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,YAAY,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAA;CAAE,GACvE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAgChC;AA4BD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,YAAY,CAAC,CA2DvB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAuC1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,aAAa,EAAE,CAAC,CAuC1B;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,qBAAqB,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1D,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6CrB;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,WAAW,EAAE,CAAC,CAkFxB"}
|
package/dist/query.js
CHANGED
|
@@ -1,180 +1,155 @@
|
|
|
1
1
|
import { getClient } from "./client.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
gte: options.startDate,
|
|
7
|
-
lte: options.endDate,
|
|
8
|
-
},
|
|
9
|
-
isBot: false, // Exclude bots by default
|
|
10
|
-
};
|
|
2
|
+
import { pageViews } from "./schema.js";
|
|
3
|
+
import { eq, and, gte, lte, count, countDistinct, desc, asc } from "drizzle-orm";
|
|
4
|
+
function buildWhereConditions(options) {
|
|
5
|
+
return and(eq(pageViews.siteId, options.siteId), gte(pageViews.timestamp, options.startDate), lte(pageViews.timestamp, options.endDate), eq(pageViews.isBot, false));
|
|
11
6
|
}
|
|
12
7
|
export async function getStats(options) {
|
|
13
8
|
const db = getClient();
|
|
14
|
-
const where =
|
|
9
|
+
const where = buildWhereConditions(options);
|
|
15
10
|
// Get page views count
|
|
16
|
-
const
|
|
11
|
+
const [pageViewCount] = await db
|
|
12
|
+
.select({ count: count() })
|
|
13
|
+
.from(pageViews)
|
|
14
|
+
.where(where);
|
|
17
15
|
// Get unique visitors
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
const visitors = visitorsResult.length;
|
|
16
|
+
const [visitorCount] = await db
|
|
17
|
+
.select({ count: countDistinct(pageViews.visitorHash) })
|
|
18
|
+
.from(pageViews)
|
|
19
|
+
.where(where);
|
|
23
20
|
// Get unique sessions
|
|
24
|
-
const
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const sessions = sessionsResult.length;
|
|
21
|
+
const [sessionCount] = await db
|
|
22
|
+
.select({ count: countDistinct(pageViews.sessionId) })
|
|
23
|
+
.from(pageViews)
|
|
24
|
+
.where(where);
|
|
29
25
|
// Calculate bounce rate (sessions with only 1 page view)
|
|
30
|
-
const sessionPageCounts = await db
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
})
|
|
35
|
-
|
|
36
|
-
|
|
26
|
+
const sessionPageCounts = await db
|
|
27
|
+
.select({
|
|
28
|
+
sessionId: pageViews.sessionId,
|
|
29
|
+
pageCount: count(),
|
|
30
|
+
})
|
|
31
|
+
.from(pageViews)
|
|
32
|
+
.where(where)
|
|
33
|
+
.groupBy(pageViews.sessionId);
|
|
34
|
+
const totalSessions = sessionPageCounts.length;
|
|
35
|
+
const bouncedSessions = sessionPageCounts.filter((s) => s.pageCount === 1).length;
|
|
36
|
+
const bounceRate = totalSessions > 0 ? (bouncedSessions / totalSessions) * 100 : 0;
|
|
37
37
|
return {
|
|
38
|
-
pageViews,
|
|
39
|
-
visitors,
|
|
40
|
-
sessions,
|
|
38
|
+
pageViews: pageViewCount?.count ?? 0,
|
|
39
|
+
visitors: visitorCount?.count ?? 0,
|
|
40
|
+
sessions: sessionCount?.count ?? 0,
|
|
41
41
|
bounceRate: Math.round(bounceRate * 100) / 100,
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
export async function getTopPages(options) {
|
|
45
45
|
const db = getClient();
|
|
46
|
-
const where =
|
|
46
|
+
const where = buildWhereConditions(options);
|
|
47
47
|
const limit = options.limit ?? 10;
|
|
48
|
-
// Group by pathname and count
|
|
49
|
-
const results = await db
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
};
|
|
48
|
+
// Group by pathname and count page views + unique visitors
|
|
49
|
+
const results = await db
|
|
50
|
+
.select({
|
|
51
|
+
pathname: pageViews.pathname,
|
|
52
|
+
pageViewCount: count(),
|
|
53
|
+
visitorCount: countDistinct(pageViews.visitorHash),
|
|
54
|
+
})
|
|
55
|
+
.from(pageViews)
|
|
56
|
+
.where(where)
|
|
57
|
+
.groupBy(pageViews.pathname)
|
|
58
|
+
.orderBy(desc(count()))
|
|
59
|
+
.limit(limit);
|
|
60
|
+
return results.map((r) => ({
|
|
61
|
+
pathname: r.pathname,
|
|
62
|
+
pageViews: r.pageViewCount,
|
|
63
|
+
visitors: r.visitorCount,
|
|
65
64
|
}));
|
|
66
|
-
// Sort by page views and limit
|
|
67
|
-
return pageVisitors
|
|
68
|
-
.sort((a, b) => b.pageViews - a.pageViews)
|
|
69
|
-
.slice(0, limit);
|
|
70
65
|
}
|
|
71
66
|
export async function getLocations(options) {
|
|
72
67
|
const db = getClient();
|
|
73
|
-
const where =
|
|
68
|
+
const where = buildWhereConditions(options);
|
|
74
69
|
const limit = options.limit ?? 20;
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
city: r.city,
|
|
95
|
-
pageViews: r._count.id,
|
|
96
|
-
visitors: uniqueVisitors.length,
|
|
97
|
-
};
|
|
70
|
+
const results = await db
|
|
71
|
+
.select({
|
|
72
|
+
country: pageViews.country,
|
|
73
|
+
countryCode: pageViews.countryCode,
|
|
74
|
+
city: pageViews.city,
|
|
75
|
+
pageViewCount: count(),
|
|
76
|
+
visitorCount: countDistinct(pageViews.visitorHash),
|
|
77
|
+
})
|
|
78
|
+
.from(pageViews)
|
|
79
|
+
.where(where)
|
|
80
|
+
.groupBy(pageViews.country, pageViews.countryCode, pageViews.city)
|
|
81
|
+
.orderBy(desc(count()))
|
|
82
|
+
.limit(limit);
|
|
83
|
+
return results.map((r) => ({
|
|
84
|
+
country: r.country,
|
|
85
|
+
countryCode: r.countryCode,
|
|
86
|
+
city: r.city,
|
|
87
|
+
pageViews: r.pageViewCount,
|
|
88
|
+
visitors: r.visitorCount,
|
|
98
89
|
}));
|
|
99
|
-
// Sort by page views and limit
|
|
100
|
-
return locationData
|
|
101
|
-
.sort((a, b) => b.pageViews - a.pageViews)
|
|
102
|
-
.slice(0, limit);
|
|
103
90
|
}
|
|
104
91
|
export async function getReferrers(options) {
|
|
105
92
|
const db = getClient();
|
|
106
|
-
const where =
|
|
93
|
+
const where = buildWhereConditions(options);
|
|
107
94
|
const limit = options.limit ?? 10;
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
})
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
visitors: uniqueVisitors.length,
|
|
124
|
-
};
|
|
95
|
+
const results = await db
|
|
96
|
+
.select({
|
|
97
|
+
referrer: pageViews.referrer,
|
|
98
|
+
pageViewCount: count(),
|
|
99
|
+
visitorCount: countDistinct(pageViews.visitorHash),
|
|
100
|
+
})
|
|
101
|
+
.from(pageViews)
|
|
102
|
+
.where(where)
|
|
103
|
+
.groupBy(pageViews.referrer)
|
|
104
|
+
.orderBy(desc(count()))
|
|
105
|
+
.limit(limit);
|
|
106
|
+
return results.map((r) => ({
|
|
107
|
+
referrer: r.referrer,
|
|
108
|
+
pageViews: r.pageViewCount,
|
|
109
|
+
visitors: r.visitorCount,
|
|
125
110
|
}));
|
|
126
|
-
// Sort by page views and limit
|
|
127
|
-
return referrerData
|
|
128
|
-
.sort((a, b) => b.pageViews - a.pageViews)
|
|
129
|
-
.slice(0, limit);
|
|
130
111
|
}
|
|
131
112
|
export async function getDevices(options) {
|
|
132
113
|
const db = getClient();
|
|
133
|
-
const where =
|
|
114
|
+
const where = buildWhereConditions(options);
|
|
134
115
|
const limit = options.limit ?? 10;
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
browser: r.browser,
|
|
155
|
-
os: r.os,
|
|
156
|
-
pageViews: r._count.id,
|
|
157
|
-
visitors: uniqueVisitors.length,
|
|
158
|
-
};
|
|
116
|
+
const results = await db
|
|
117
|
+
.select({
|
|
118
|
+
device: pageViews.device,
|
|
119
|
+
browser: pageViews.browser,
|
|
120
|
+
os: pageViews.os,
|
|
121
|
+
pageViewCount: count(),
|
|
122
|
+
visitorCount: countDistinct(pageViews.visitorHash),
|
|
123
|
+
})
|
|
124
|
+
.from(pageViews)
|
|
125
|
+
.where(where)
|
|
126
|
+
.groupBy(pageViews.device, pageViews.browser, pageViews.os)
|
|
127
|
+
.orderBy(desc(count()))
|
|
128
|
+
.limit(limit);
|
|
129
|
+
return results.map((r) => ({
|
|
130
|
+
device: r.device,
|
|
131
|
+
browser: r.browser,
|
|
132
|
+
os: r.os,
|
|
133
|
+
pageViews: r.pageViewCount,
|
|
134
|
+
visitors: r.visitorCount,
|
|
159
135
|
}));
|
|
160
|
-
// Sort by page views and limit
|
|
161
|
-
return deviceData
|
|
162
|
-
.sort((a, b) => b.pageViews - a.pageViews)
|
|
163
|
-
.slice(0, limit);
|
|
164
136
|
}
|
|
165
137
|
export async function getTimeSeries(options) {
|
|
166
138
|
const db = getClient();
|
|
167
|
-
const where =
|
|
139
|
+
const where = buildWhereConditions(options);
|
|
168
140
|
const interval = options.interval ?? "day";
|
|
169
141
|
// Get all page views in range
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
})
|
|
142
|
+
const results = await db
|
|
143
|
+
.select({
|
|
144
|
+
timestamp: pageViews.timestamp,
|
|
145
|
+
visitorHash: pageViews.visitorHash,
|
|
146
|
+
})
|
|
147
|
+
.from(pageViews)
|
|
148
|
+
.where(where)
|
|
149
|
+
.orderBy(asc(pageViews.timestamp));
|
|
175
150
|
// Group by interval
|
|
176
151
|
const groups = new Map();
|
|
177
|
-
for (const pv of
|
|
152
|
+
for (const pv of results) {
|
|
178
153
|
const key = formatDateKey(pv.timestamp, interval);
|
|
179
154
|
const group = groups.get(key) ?? { views: 0, visitors: new Set() };
|
|
180
155
|
group.views++;
|
|
@@ -213,16 +188,19 @@ function formatDateKey(date, interval) {
|
|
|
213
188
|
*/
|
|
214
189
|
export async function getSessionStats(options) {
|
|
215
190
|
const db = getClient();
|
|
216
|
-
const where =
|
|
191
|
+
const where = buildWhereConditions(options);
|
|
217
192
|
// Get all page views grouped by session
|
|
218
|
-
const
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
})
|
|
193
|
+
const results = await db
|
|
194
|
+
.select({
|
|
195
|
+
sessionId: pageViews.sessionId,
|
|
196
|
+
timestamp: pageViews.timestamp,
|
|
197
|
+
})
|
|
198
|
+
.from(pageViews)
|
|
199
|
+
.where(where)
|
|
200
|
+
.orderBy(asc(pageViews.timestamp));
|
|
223
201
|
// Group page views by session
|
|
224
202
|
const sessions = new Map();
|
|
225
|
-
for (const pv of
|
|
203
|
+
for (const pv of results) {
|
|
226
204
|
const timestamps = sessions.get(pv.sessionId) ?? [];
|
|
227
205
|
timestamps.push(pv.timestamp);
|
|
228
206
|
sessions.set(pv.sessionId, timestamps);
|
|
@@ -244,10 +222,8 @@ export async function getSessionStats(options) {
|
|
|
244
222
|
totalPageCount += pageCount;
|
|
245
223
|
if (pageCount === 1) {
|
|
246
224
|
bounceCount++;
|
|
247
|
-
// Single page view = 0 duration
|
|
248
225
|
}
|
|
249
226
|
else {
|
|
250
|
-
// Duration = last timestamp - first timestamp
|
|
251
227
|
const sorted = timestamps.sort((a, b) => a.getTime() - b.getTime());
|
|
252
228
|
const firstTimestamp = sorted[0];
|
|
253
229
|
const lastTimestamp = sorted[sorted.length - 1];
|
|
@@ -269,17 +245,20 @@ export async function getSessionStats(options) {
|
|
|
269
245
|
*/
|
|
270
246
|
export async function getEntryPages(options) {
|
|
271
247
|
const db = getClient();
|
|
272
|
-
const where =
|
|
248
|
+
const where = buildWhereConditions(options);
|
|
273
249
|
const limit = options.limit ?? 10;
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
})
|
|
250
|
+
const results = await db
|
|
251
|
+
.select({
|
|
252
|
+
sessionId: pageViews.sessionId,
|
|
253
|
+
pathname: pageViews.pathname,
|
|
254
|
+
timestamp: pageViews.timestamp,
|
|
255
|
+
})
|
|
256
|
+
.from(pageViews)
|
|
257
|
+
.where(where)
|
|
258
|
+
.orderBy(asc(pageViews.timestamp));
|
|
280
259
|
// Find first page view per session
|
|
281
260
|
const sessionFirstPages = new Map();
|
|
282
|
-
for (const pv of
|
|
261
|
+
for (const pv of results) {
|
|
283
262
|
if (!sessionFirstPages.has(pv.sessionId)) {
|
|
284
263
|
sessionFirstPages.set(pv.sessionId, pv.pathname);
|
|
285
264
|
}
|
|
@@ -290,7 +269,6 @@ export async function getEntryPages(options) {
|
|
|
290
269
|
entryPageCounts.set(pathname, (entryPageCounts.get(pathname) ?? 0) + 1);
|
|
291
270
|
}
|
|
292
271
|
const totalSessions = sessionFirstPages.size;
|
|
293
|
-
// Convert to array and sort
|
|
294
272
|
return Array.from(entryPageCounts.entries())
|
|
295
273
|
.map(([pathname, count]) => ({
|
|
296
274
|
pathname,
|
|
@@ -305,17 +283,20 @@ export async function getEntryPages(options) {
|
|
|
305
283
|
*/
|
|
306
284
|
export async function getExitPages(options) {
|
|
307
285
|
const db = getClient();
|
|
308
|
-
const where =
|
|
286
|
+
const where = buildWhereConditions(options);
|
|
309
287
|
const limit = options.limit ?? 10;
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
})
|
|
288
|
+
const results = await db
|
|
289
|
+
.select({
|
|
290
|
+
sessionId: pageViews.sessionId,
|
|
291
|
+
pathname: pageViews.pathname,
|
|
292
|
+
timestamp: pageViews.timestamp,
|
|
293
|
+
})
|
|
294
|
+
.from(pageViews)
|
|
295
|
+
.where(where)
|
|
296
|
+
.orderBy(desc(pageViews.timestamp));
|
|
316
297
|
// Find last page view per session
|
|
317
298
|
const sessionLastPages = new Map();
|
|
318
|
-
for (const pv of
|
|
299
|
+
for (const pv of results) {
|
|
319
300
|
if (!sessionLastPages.has(pv.sessionId)) {
|
|
320
301
|
sessionLastPages.set(pv.sessionId, pv.pathname);
|
|
321
302
|
}
|
|
@@ -326,7 +307,6 @@ export async function getExitPages(options) {
|
|
|
326
307
|
exitPageCounts.set(pathname, (exitPageCounts.get(pathname) ?? 0) + 1);
|
|
327
308
|
}
|
|
328
309
|
const totalSessions = sessionLastPages.size;
|
|
329
|
-
// Convert to array and sort
|
|
330
310
|
return Array.from(exitPageCounts.entries())
|
|
331
311
|
.map(([pathname, count]) => ({
|
|
332
312
|
pathname,
|
|
@@ -341,18 +321,21 @@ export async function getExitPages(options) {
|
|
|
341
321
|
*/
|
|
342
322
|
export async function getPageFlows(options) {
|
|
343
323
|
const db = getClient();
|
|
344
|
-
const where =
|
|
324
|
+
const where = buildWhereConditions(options);
|
|
345
325
|
const limit = options.limit ?? 10;
|
|
346
326
|
const maxPathLength = options.maxPathLength ?? 5;
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
})
|
|
327
|
+
const results = await db
|
|
328
|
+
.select({
|
|
329
|
+
sessionId: pageViews.sessionId,
|
|
330
|
+
pathname: pageViews.pathname,
|
|
331
|
+
timestamp: pageViews.timestamp,
|
|
332
|
+
})
|
|
333
|
+
.from(pageViews)
|
|
334
|
+
.where(where)
|
|
335
|
+
.orderBy(asc(pageViews.timestamp));
|
|
353
336
|
// Build paths per session
|
|
354
337
|
const sessionPaths = new Map();
|
|
355
|
-
for (const pv of
|
|
338
|
+
for (const pv of results) {
|
|
356
339
|
const path = sessionPaths.get(pv.sessionId) ?? [];
|
|
357
340
|
// Only add if different from last (avoid duplicates from refreshes)
|
|
358
341
|
if (path.length === 0 || path[path.length - 1] !== pv.pathname) {
|
|
@@ -368,7 +351,6 @@ export async function getPageFlows(options) {
|
|
|
368
351
|
pathCounts.set(key, (pathCounts.get(key) ?? 0) + 1);
|
|
369
352
|
}
|
|
370
353
|
const totalSessions = sessionPaths.size;
|
|
371
|
-
// Convert to array and sort
|
|
372
354
|
return Array.from(pathCounts.entries())
|
|
373
355
|
.map(([key, count]) => ({
|
|
374
356
|
path: JSON.parse(key),
|
|
@@ -383,26 +365,25 @@ export async function getPageFlows(options) {
|
|
|
383
365
|
*/
|
|
384
366
|
export async function getSessions(options) {
|
|
385
367
|
const db = getClient();
|
|
386
|
-
const where =
|
|
368
|
+
const where = buildWhereConditions(options);
|
|
387
369
|
const limit = options.limit ?? 50;
|
|
388
370
|
const offset = options.offset ?? 0;
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
orderBy
|
|
402
|
-
});
|
|
371
|
+
const results = await db
|
|
372
|
+
.select({
|
|
373
|
+
sessionId: pageViews.sessionId,
|
|
374
|
+
visitorHash: pageViews.visitorHash,
|
|
375
|
+
pathname: pageViews.pathname,
|
|
376
|
+
timestamp: pageViews.timestamp,
|
|
377
|
+
country: pageViews.country,
|
|
378
|
+
device: pageViews.device,
|
|
379
|
+
browser: pageViews.browser,
|
|
380
|
+
})
|
|
381
|
+
.from(pageViews)
|
|
382
|
+
.where(where)
|
|
383
|
+
.orderBy(asc(pageViews.timestamp));
|
|
403
384
|
// Group by session
|
|
404
385
|
const sessionMap = new Map();
|
|
405
|
-
for (const pv of
|
|
386
|
+
for (const pv of results) {
|
|
406
387
|
const existing = sessionMap.get(pv.sessionId);
|
|
407
388
|
if (existing) {
|
|
408
389
|
existing.pages.push({ pathname: pv.pathname, timestamp: pv.timestamp });
|
|
@@ -423,7 +404,6 @@ export async function getSessions(options) {
|
|
|
423
404
|
const sortedPages = data.pages.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
|
|
424
405
|
const firstPage = sortedPages[0];
|
|
425
406
|
const lastPage = sortedPages[sortedPages.length - 1];
|
|
426
|
-
// Skip if somehow we have no pages (shouldn't happen)
|
|
427
407
|
if (!firstPage || !lastPage)
|
|
428
408
|
continue;
|
|
429
409
|
const startTime = firstPage.timestamp;
|
|
@@ -444,28 +424,9 @@ export async function getSessions(options) {
|
|
|
444
424
|
browser: data.browser,
|
|
445
425
|
});
|
|
446
426
|
}
|
|
447
|
-
// Sort by startTime descending
|
|
427
|
+
// Sort by startTime descending and paginate
|
|
448
428
|
return sessions
|
|
449
429
|
.sort((a, b) => b.startTime.getTime() - a.startTime.getTime())
|
|
450
430
|
.slice(offset, offset + limit);
|
|
451
431
|
}
|
|
452
|
-
// Get or create a site
|
|
453
|
-
export async function getOrCreateSite(domain, name) {
|
|
454
|
-
const db = getClient();
|
|
455
|
-
let site = await db.site.findUnique({ where: { domain } });
|
|
456
|
-
if (!site) {
|
|
457
|
-
site = await db.site.create({
|
|
458
|
-
data: {
|
|
459
|
-
domain,
|
|
460
|
-
name: name ?? domain,
|
|
461
|
-
},
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
return site;
|
|
465
|
-
}
|
|
466
|
-
// List all sites
|
|
467
|
-
export async function listSites() {
|
|
468
|
-
const db = getClient();
|
|
469
|
-
return db.site.findMany({ orderBy: { name: "asc" } });
|
|
470
|
-
}
|
|
471
432
|
//# sourceMappingURL=query.js.map
|