Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 13 additions & 19 deletions src/app/api/dashboard/stats/route.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,25 @@
import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { getAuthenticatedUser, handleErrorResponse } from "@/lib/apiUtils";

import { authOptions } from "@/lib/auth";
import { fetchViewerLogin } from "@/lib/githubViewer";
import { fetchCommitActivityHeatmap } from "@/lib/githubYearInReview";

export async function GET(request: NextRequest) {
const session = await getServerSession(authOptions);
const token = session?.accessToken;
try {
const user = await getAuthenticatedUser();
if (!user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

if (!session || !token) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const yearParam = request.nextUrl.searchParams.get("year");
const year = yearParam ? Number.parseInt(yearParam, 10) : new Date().getUTCFullYear();

const yearParam = request.nextUrl.searchParams.get("year");
const year = yearParam ? Number.parseInt(yearParam, 10) : new Date().getUTCFullYear();
if (!Number.isFinite(year) || year < 2008 || year > new Date().getUTCFullYear()) {
return NextResponse.json({ error: "Invalid year" }, { status: 400 });
}
Comment thread
is0692vs marked this conversation as resolved.

if (!Number.isFinite(year) || year < 2008 || year > new Date().getUTCFullYear()) {
return NextResponse.json({ error: "Invalid year" }, { status: 400 });
}

try {
const username = session.user?.login ?? (await fetchViewerLogin(token));
const heatmap = await fetchCommitActivityHeatmap(username, year, token);
const heatmap = await fetchCommitActivityHeatmap(user.username, year, user.token);
return NextResponse.json({ year, heatmap });
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
return NextResponse.json({ error: message }, { status: 500 });
return handleErrorResponse(error);
}
}
24 changes: 9 additions & 15 deletions src/app/api/dashboard/summary/route.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,18 @@
import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { getAuthenticatedUser, handleErrorResponse } from "@/lib/apiUtils";

import { authOptions } from "@/lib/auth";
import { fetchUserSummary } from "@/lib/github";
import { fetchViewerLogin } from "@/lib/githubViewer";

export async function GET() {
const session = await getServerSession(authOptions);
const token = session?.accessToken;

if (!session || !token) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

try {
const username = session.user?.login ?? (await fetchViewerLogin(token));
const summary = await fetchUserSummary(username, token);
return NextResponse.json({ username, summary });
const user = await getAuthenticatedUser();
if (!user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

const summary = await fetchUserSummary(user.username, user.token);
return NextResponse.json({ username: user.username, summary });
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
return NextResponse.json({ error: message }, { status: 500 });
return handleErrorResponse(error);
}
}
32 changes: 13 additions & 19 deletions src/app/api/dashboard/year/route.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,25 @@
import { NextRequest, NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { getAuthenticatedUser, handleErrorResponse } from "@/lib/apiUtils";

import { authOptions } from "@/lib/auth";
import { fetchViewerLogin } from "@/lib/githubViewer";
import { fetchYearInReviewData } from "@/lib/githubYearInReview";

export async function GET(request: NextRequest) {
const session = await getServerSession(authOptions);
const token = session?.accessToken;
try {
const user = await getAuthenticatedUser();
if (!user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}

if (!session || !token) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const yearParam = request.nextUrl.searchParams.get("year");
const year = yearParam ? Number.parseInt(yearParam, 10) : new Date().getUTCFullYear();

const yearParam = request.nextUrl.searchParams.get("year");
const year = yearParam ? Number.parseInt(yearParam, 10) : new Date().getUTCFullYear();
if (!Number.isFinite(year) || year < 2008 || year > new Date().getUTCFullYear()) {
return NextResponse.json({ error: "Invalid year" }, { status: 400 });
}

if (!Number.isFinite(year) || year < 2008 || year > new Date().getUTCFullYear()) {
return NextResponse.json({ error: "Invalid year" }, { status: 400 });
}

try {
const username = session.user?.login ?? (await fetchViewerLogin(token));
const data = await fetchYearInReviewData(username, year, token);
const data = await fetchYearInReviewData(user.username, year, user.token);
return NextResponse.json(data);
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
return NextResponse.json({ error: message }, { status: 500 });
return handleErrorResponse(error);
}
}
21 changes: 21 additions & 0 deletions src/lib/apiUtils.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { NextResponse } from "next/server";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { fetchViewerLogin } from "@/lib/githubViewer";

export async function getAuthenticatedUser() {
const session = await getServerSession(authOptions);
const token = session?.accessToken;

if (!session || !token) {
return null;
}

const username = session.user?.login ?? (await fetchViewerLogin(token));
return { username, token };
}

export function handleErrorResponse(error: unknown) {
const message = error instanceof Error ? error.message : "Unknown error";
return NextResponse.json({ error: message }, { status: 500 });
}
Comment thread
is0692vs marked this conversation as resolved.
Comment thread
is0692vs marked this conversation as resolved.
Loading