import { NextRequest, NextResponse } from 'next/server' import { templates } from '@/components/template-data' export async function POST(request: NextRequest) { try { const { templateId, repoName, description, isPrivate } = await request.json() const template = templates.find(t => t.id === templateId) if (!template) { return NextResponse.json( { error: 'Template not found' }, { status: 404 } ) } // Get GitHub token from environment or request headers const githubToken = request.headers.get('X-GitHub-Token') || process.env.GITHUB_TOKEN if (!githubToken) { return NextResponse.json( { error: 'GitHub authentication required' }, { status: 401 } ) } // Create repository using GitHub API const createRepoResponse = await fetch('https://api.github.com/user/repos', { method: 'POST', headers: { 'Authorization': `Bearer ${githubToken}`, 'Accept': 'application/vnd.github.v3+json', 'Content-Type': 'application/json' }, body: JSON.stringify({ name: repoName || `${template.id}-project`, description: description || template.description, private: isPrivate || false, auto_init: true, has_issues: true, has_projects: false, has_wiki: false }) }) if (!createRepoResponse.ok) { const error = await createRepoResponse.json() return NextResponse.json( { error: error.message || 'Failed to create repository' }, { status: createRepoResponse.status } ) } const repo = await createRepoResponse.json() // If template has a GitHub URL, we can suggest importing it if (template.githubUrl) { // Add a README with instructions const readmeContent = `# ${repoName || template.name} ${description || template.description} ## Getting Started This project was created from the ${template.name} template. ### Quick Setup \`\`\`bash # Clone this repository git clone ${repo.clone_url} # Navigate to the project cd ${repo.name} # Install dependencies npm install # Start development server npm run dev \`\`\` ### Template Information - **Template**: ${template.name} - **Category**: ${template.category} - **Technologies**: ${template.tech.join(', ')} ### Features ${template.features.map(f => `- ${f}`).join('\n')} ### Deploy ${template.deployUrls?.vercel ? `[![Deploy with Vercel](https://vercel.com/button)](${template.deployUrls.vercel})` : ''} ${template.deployUrls?.netlify ? `[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](${template.deployUrls.netlify})` : ''} ${template.deployUrls?.railway ? `[![Deploy on Railway](https://railway.app/button.svg)](${template.deployUrls.railway})` : ''} ## License MIT --- Created with [Hanzo AI Templates](https://hanzo.ai/templates) ` // Create README file const createFileResponse = await fetch( `https://api.github.com/repos/${repo.owner.login}/${repo.name}/contents/README.md`, { method: 'PUT', headers: { 'Authorization': `Bearer ${githubToken}`, 'Accept': 'application/vnd.github.v3+json', 'Content-Type': 'application/json' }, body: JSON.stringify({ message: 'Initial commit with template information', content: Buffer.from(readmeContent).toString('base64') }) } ) if (!createFileResponse.ok) { console.error('Failed to create README:', await createFileResponse.text()) } } return NextResponse.json({ success: true, repository: { name: repo.name, url: repo.html_url, cloneUrl: repo.clone_url, description: repo.description }, message: 'Repository created successfully', nextSteps: [ `Clone your repository: git clone ${repo.clone_url}`, 'Copy template files to your repository', 'Commit and push your changes' ] }) } catch (error) { console.error('Error creating GitHub repository:', error) return NextResponse.json( { error: 'Failed to create GitHub repository' }, { status: 500 } ) } }