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 } ); } }