KrishnaCosmic's picture
deployment
1ba9d5e
/**
* Contributor Dashboard Route
*
* Get dashboard stats and issues for contributors.
*/
import { NextRequest, NextResponse } from "next/server";
import { getCurrentUser } from "@/lib/auth";
import { getIssuesWithTriage } from "@/lib/db/queries/issues";
import { getContributorRepositories } from "@/lib/db/queries/repositories";
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 page = parseInt(searchParams.get("page") || "1");
const limit = parseInt(searchParams.get("limit") || "10");
// Get contributor's issues
const [repos, issuesData] = await Promise.all([
getContributorRepositories(user.id, user.username),
getIssuesWithTriage({ authorName: user.username }, page, limit),
]);
// Calculate stats
const myIssues = issuesData.issues.filter(i => !i.isPR);
const myPRs = issuesData.issues.filter(i => i.isPR);
return NextResponse.json({
stats: {
totalIssues: myIssues.length,
totalPRs: myPRs.length,
openIssues: myIssues.filter(i => i.state === "open").length,
openPRs: myPRs.filter(i => i.state === "open").length,
repositoriesContributed: repos.length,
},
repositories: repos,
issues: issuesData.issues,
pagination: {
page: issuesData.page,
limit: issuesData.limit,
total: issuesData.total,
totalPages: issuesData.totalPages,
}
});
} catch (error) {
console.error("Contributor dashboard error:", error);
return NextResponse.json({ error: "Internal server error" }, { status: 500 });
}
}