Spaces:
Sleeping
Sleeping
| /** | |
| * User Activity Route | |
| * | |
| * GET /api/user/activity | |
| * Returns user activity data for contribution heatmap and streak info | |
| */ | |
| import { NextRequest, NextResponse } from "next/server"; | |
| import { getCurrentUser } from "@/lib/auth"; | |
| import { getUserStreak, getUserCalendar } from "@/lib/db/queries/gamification"; | |
| export async function GET(request: NextRequest) { | |
| try { | |
| const user = await getCurrentUser(request); | |
| if (!user) { | |
| return NextResponse.json({ error: "Unauthorized" }, { status: 401 }); | |
| } | |
| const { searchParams } = new URL(request.url); | |
| const days = parseInt(searchParams.get("days") || "365"); | |
| // Get streak and calendar data | |
| const [streak, calendar] = await Promise.all([ | |
| getUserStreak(user.username), | |
| getUserCalendar(user.username, days) | |
| ]); | |
| return NextResponse.json({ | |
| activity: calendar, | |
| streak: { | |
| current_streak: streak.current_streak, | |
| longest_streak: streak.longest_streak, | |
| is_active: streak.is_active, | |
| total_contribution_days: streak.total_contribution_days | |
| }, | |
| lastUpdated: new Date().toISOString() | |
| }); | |
| } catch (error) { | |
| console.error("GET /api/user/activity error:", error); | |
| return NextResponse.json({ error: "Internal server error" }, { status: 500 }); | |
| } | |
| } | |