opentriage-api / src /app /api /issues /save /route.ts
KrishnaCosmic's picture
Add PR persistence feature
a905864
/**
* Save Issues/PRs Route
*
* POST /api/issues/save
* Save GitHub-fetched issues/PRs to the database for persistence
*/
import { NextRequest, NextResponse } from "next/server";
import { getCurrentUser } from "@/lib/auth";
import { createIssue, getIssueByGithubId } from "@/lib/db/queries/issues";
export async function POST(request: NextRequest) {
try {
const user = await getCurrentUser(request);
if (!user) {
return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
}
const body = await request.json();
const { issues } = body;
if (!issues || !Array.isArray(issues)) {
return NextResponse.json({
error: "issues array is required"
}, { status: 400 });
}
let saved = 0;
let skipped = 0;
for (const issue of issues) {
// Skip if already in database (by githubIssueId)
if (issue.githubIssueId) {
const existing = await getIssueByGithubId(issue.githubIssueId);
if (existing) {
skipped++;
continue;
}
}
// Save to database
try {
await createIssue({
githubIssueId: issue.githubIssueId || issue.number,
number: issue.number,
title: issue.title,
body: issue.body || '',
authorName: issue.authorName,
repoId: issue.repoId,
repoName: issue.repoName,
owner: issue.owner,
repo: issue.repo,
htmlUrl: issue.htmlUrl,
state: issue.state || 'open',
isPR: issue.isPR || false,
});
saved++;
} catch (err) {
console.log('Could not save issue:', issue.number, err);
skipped++;
}
}
return NextResponse.json({
success: true,
saved,
skipped,
total: issues.length,
});
} catch (error: any) {
console.error("POST /api/issues/save error:", error);
return NextResponse.json({
error: "Failed to save issues",
detail: error.message
}, { status: 500 });
}
}