import { NextRequest, NextResponse } from 'next/server' // Woodpecker API configuration const WOODPECKER_URL = process.env.WOODPECKER_URL || 'http://woodpecker-server:8000' const WOODPECKER_TOKEN = process.env.WOODPECKER_TOKEN || '' interface PipelineStep { name: string state: 'pending' | 'running' | 'success' | 'failure' | 'skipped' exit_code: number } interface Pipeline { id: number number: number status: 'pending' | 'running' | 'success' | 'failure' event: string branch: string commit: string message: string author: string created: number started: number finished: number steps: PipelineStep[] } interface CICDStatusResponse { status: 'online' | 'offline' pipelines: Pipeline[] lastUpdate: string } export async function GET(request: NextRequest) { const searchParams = request.nextUrl.searchParams const repoId = searchParams.get('repo') || '1' const limit = parseInt(searchParams.get('limit') || '5') try { // Fetch pipelines from Woodpecker API const response = await fetch( `${WOODPECKER_URL}/api/repos/${repoId}/pipelines?per_page=${limit}`, { headers: { 'Authorization': `Bearer ${WOODPECKER_TOKEN}`, 'Content-Type': 'application/json', }, cache: 'no-store', } ) if (!response.ok) { // If Woodpecker is not available, return offline status return NextResponse.json({ status: 'offline', pipelines: [], lastUpdate: new Date().toISOString(), error: 'Woodpecker API nicht erreichbar' } as CICDStatusResponse) } const rawPipelines = await response.json() // Transform pipelines to our format const pipelines: Pipeline[] = rawPipelines.map((p: any) => ({ id: p.id, number: p.number, status: p.status, event: p.event, branch: p.branch, commit: p.commit?.substring(0, 7) || '', message: p.message || '', author: p.author, created: p.created, started: p.started, finished: p.finished, steps: p.workflows?.[0]?.children?.map((c: any) => ({ name: c.name, state: c.state, exit_code: c.exit_code })) || [] })) return NextResponse.json({ status: 'online', pipelines, lastUpdate: new Date().toISOString() } as CICDStatusResponse) } catch (error) { console.error('CI/CD Status API error:', error) return NextResponse.json({ status: 'offline', pipelines: [], lastUpdate: new Date().toISOString(), error: 'Fehler beim Abrufen des CI/CD Status' } as CICDStatusResponse) } } // Trigger a new pipeline export async function POST(request: NextRequest) { try { const body = await request.json() const { repoId = '1', branch = 'main' } = body const response = await fetch( `${WOODPECKER_URL}/api/repos/${repoId}/pipelines`, { method: 'POST', headers: { 'Authorization': `Bearer ${WOODPECKER_TOKEN}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ branch }), } ) if (!response.ok) { return NextResponse.json( { error: 'Pipeline konnte nicht gestartet werden' }, { status: 500 } ) } const pipeline = await response.json() return NextResponse.json({ success: true, pipeline: { id: pipeline.id, number: pipeline.number, status: pipeline.status } }) } catch (error) { console.error('Pipeline trigger error:', error) return NextResponse.json( { error: 'Fehler beim Starten der Pipeline' }, { status: 500 } ) } }