mirror of
https://github.com/Litlyx/litlyx
synced 2025-12-10 07:48:37 +01:00
76 lines
2.5 KiB
TypeScript
76 lines
2.5 KiB
TypeScript
import { getUserProjectFromId } from "~/server/LIVE_DEMO_DATA";
|
|
import { ProjectCountModel } from "@schema/ProjectsCounts";
|
|
import { SessionModel } from "@schema/metrics/SessionSchema";
|
|
import { COUNTS_EXPIRE_TIME, COUNTS_SESSIONS_EXPIRE_TIME, Redis } from "~/server/services/CacheService";
|
|
import { EventModel } from "@schema/metrics/EventSchema";
|
|
import { VisitModel } from "@schema/metrics/VisitSchema";
|
|
|
|
export type MetricsCounts = {
|
|
eventsCount: number,
|
|
visitsCount: number,
|
|
sessionsVisitsCount: number,
|
|
firstEventDate: number,
|
|
firstViewDate: number,
|
|
avgSessionDuration: number
|
|
}
|
|
|
|
export default defineEventHandler(async event => {
|
|
|
|
const project_id = getRequestProjectId(event);
|
|
if (!project_id) return;
|
|
|
|
const user = getRequestUser(event);
|
|
const project = await getUserProjectFromId(project_id, user);
|
|
if (!project) return;
|
|
|
|
|
|
return await Redis.useCache({
|
|
key: `counts:${project_id}`,
|
|
exp: COUNTS_EXPIRE_TIME
|
|
}, async () => {
|
|
|
|
|
|
const count: { events: number, visits: number }[] = await ProjectCountModel.aggregate([
|
|
{ $match: { project_id: project._id } },
|
|
{
|
|
$group: {
|
|
_id: "$project_id",
|
|
events: { $sum: "$events" },
|
|
visits: { $sum: "$visits" }
|
|
}
|
|
}
|
|
]);
|
|
|
|
|
|
const sessionsVisitsCount: any[] = await Redis.useCache({
|
|
key: `counts:${project_id}:sessions_count`,
|
|
exp: COUNTS_SESSIONS_EXPIRE_TIME
|
|
}, async () => {
|
|
return await SessionModel.aggregate([
|
|
{ $match: { project_id: project._id } },
|
|
{ $group: { _id: "$session", time: { $sum: '$duration' }, count: { $sum: 1 } } },
|
|
])
|
|
});
|
|
|
|
const totalSessions = sessionsVisitsCount.length;
|
|
const totalSessionsTime = sessionsVisitsCount.reduce((a, e) => a + e.time, 0);
|
|
const avgSessionDuration = totalSessionsTime / totalSessions;
|
|
|
|
const firstEvent = await EventModel.findOne({ project_id: project._id }, { created_at: 1 });
|
|
const firstView = await VisitModel.findOne({ project_id: project._id }, { created_at: 1 });
|
|
|
|
return {
|
|
eventsCount: count[0].events,
|
|
visitsCount: count[0].visits,
|
|
sessionsVisitsCount: totalSessions || 0,
|
|
avgSessionDuration,
|
|
firstEventDate: firstEvent?.created_at.getTime() || Date.now(),
|
|
firstViewDate: firstView?.created_at.getTime() || Date.now(),
|
|
} as MetricsCounts;
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
}); |