···
import { db } from "../../../libs/db";
2
-
import { users as usersTable } from "../../../libs/schema";
2
+
import { users as usersTable, takes as takesTable } from "../../../libs/schema";
import { handleApiError } from "../../../libs/apiError";
4
-
import { eq } from "drizzle-orm";
4
+
import { eq, sql } from "drizzle-orm";
6
+
// Time data cache to reduce database queries
7
+
const timeCache = new Map<
12
+
totalTakesTime: number;
13
+
dailyStats: { date: string; seconds: number }[];
18
+
const TIME_CACHE_TTL = 5 * 60 * 1000; // 5 minutes cache TTL
export async function time(url: URL): Promise<Response> {
···
38
+
// Check cache before database query
39
+
const cacheKey = `time_${userId}`;
40
+
const cached = timeCache.get(cacheKey);
41
+
if (cached && Date.now() - cached.timestamp < TIME_CACHE_TTL) {
42
+
return new Response(JSON.stringify(cached.data), {
44
+
"Content-Type": "application/json",
// Get user's total takes time from the database
const userData = await db
···
47
-
return new Response(
50
-
totalTakesTime: userData[0].totalTakesTime || 0,
54
-
"Content-Type": "application/json",
72
+
// Get time logged per day
73
+
const dailyStats = await db
75
+
date: sql<string>`DATE(${takesTable.createdAt})`,
76
+
dailyTotal: sql<number>`SUM(${takesTable.elapsedTime})`,
79
+
.where(eq(takesTable.userId, userId))
80
+
.groupBy(sql`DATE(${takesTable.createdAt})`)
81
+
.orderBy(sql`DATE(${takesTable.createdAt}) DESC`);
83
+
const responseData = {
85
+
totalTakesTime: userData[0].totalTakesTime || 0,
86
+
dailyStats: dailyStats.map((day) => ({
88
+
seconds: day.dailyTotal,
93
+
timeCache.set(cacheKey, {
95
+
timestamp: Date.now(),
98
+
return new Response(JSON.stringify(responseData), {
100
+
"Content-Type": "application/json",
return handleApiError(error, "userTime");