80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
import { NextResponse } from 'next/server';
|
|
import { getAdminAuth, getAdminDb } from '@/lib/firebase/admin';
|
|
|
|
/**
|
|
* Fetch user's GitHub repositories
|
|
*/
|
|
export async function GET(request: Request) {
|
|
try {
|
|
const authHeader = request.headers.get('Authorization');
|
|
if (!authHeader?.startsWith('Bearer ')) {
|
|
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
|
|
}
|
|
|
|
const idToken = authHeader.split('Bearer ')[1];
|
|
const adminAuth = getAdminAuth();
|
|
const adminDb = getAdminDb();
|
|
|
|
let userId: string;
|
|
try {
|
|
const decodedToken = await adminAuth.verifyIdToken(idToken);
|
|
userId = decodedToken.uid;
|
|
} catch (error) {
|
|
return NextResponse.json({ error: 'Invalid token' }, { status: 401 });
|
|
}
|
|
|
|
// Get GitHub connection
|
|
const connectionDoc = await adminDb
|
|
.collection('githubConnections')
|
|
.doc(userId)
|
|
.get();
|
|
|
|
if (!connectionDoc.exists) {
|
|
return NextResponse.json(
|
|
{ error: 'GitHub not connected' },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
const connection = connectionDoc.data()!;
|
|
const accessToken = connection.accessToken; // TODO: Decrypt
|
|
|
|
// Fetch repos from GitHub API
|
|
const response = await fetch('https://api.github.com/user/repos?sort=updated&per_page=100', {
|
|
headers: {
|
|
Authorization: `Bearer ${accessToken}`,
|
|
Accept: 'application/vnd.github.v3+json',
|
|
},
|
|
});
|
|
|
|
if (!response.ok) {
|
|
throw new Error('Failed to fetch repositories from GitHub');
|
|
}
|
|
|
|
const repos = await response.json();
|
|
|
|
// Return simplified repo data
|
|
return NextResponse.json(
|
|
repos.map((repo: any) => ({
|
|
id: repo.id,
|
|
name: repo.name,
|
|
full_name: repo.full_name,
|
|
description: repo.description,
|
|
html_url: repo.html_url,
|
|
language: repo.language,
|
|
default_branch: repo.default_branch,
|
|
private: repo.private,
|
|
topics: repo.topics || [],
|
|
updated_at: repo.updated_at,
|
|
}))
|
|
);
|
|
} catch (error) {
|
|
console.error('[GitHub Repos] Error:', error);
|
|
return NextResponse.json(
|
|
{ error: 'Failed to fetch repositories' },
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|
|
|