feat: BreakPilot PWA - Full codebase (clean push without large binaries)
Some checks failed
Tests / Go Tests (push) Has been cancelled
Tests / Python Tests (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / Go Lint (push) Has been cancelled
Tests / Python Lint (push) Has been cancelled
Tests / Security Scan (push) Has been cancelled
Tests / All Checks Passed (push) Has been cancelled
Security Scanning / Secret Scanning (push) Has been cancelled
Security Scanning / Dependency Vulnerability Scan (push) Has been cancelled
Security Scanning / Go Security Scan (push) Has been cancelled
Security Scanning / Python Security Scan (push) Has been cancelled
Security Scanning / Node.js Security Scan (push) Has been cancelled
Security Scanning / Docker Image Security (push) Has been cancelled
Security Scanning / Security Summary (push) Has been cancelled
CI/CD Pipeline / Go Tests (push) Has been cancelled
CI/CD Pipeline / Python Tests (push) Has been cancelled
CI/CD Pipeline / Website Tests (push) Has been cancelled
CI/CD Pipeline / Linting (push) Has been cancelled
CI/CD Pipeline / Security Scan (push) Has been cancelled
CI/CD Pipeline / Docker Build & Push (push) Has been cancelled
CI/CD Pipeline / Integration Tests (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / CI Summary (push) Has been cancelled
ci/woodpecker/manual/build-ci-image Pipeline was successful
ci/woodpecker/manual/main Pipeline failed

All services: admin-v2, studio-v2, website, ai-compliance-sdk,
consent-service, klausur-service, voice-service, and infrastructure.
Large PDFs and compiled binaries excluded via .gitignore.
This commit is contained in:
BreakPilot Dev
2026-02-11 13:25:58 +01:00
commit 19855efacc
2512 changed files with 933814 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
/**
* Consent Admin API Route - Audit Log Proxy
*/
import { NextRequest, NextResponse } from 'next/server'
const CONSENT_SERVICE_URL = process.env.CONSENT_SERVICE_URL || 'http://localhost:8081'
export async function GET(request: NextRequest) {
try {
const authHeader = request.headers.get('Authorization')
const limit = request.nextUrl.searchParams.get('limit') || '100'
const offset = request.nextUrl.searchParams.get('offset') || '0'
const action = request.nextUrl.searchParams.get('action') || ''
const url = new URL(`${CONSENT_SERVICE_URL}/api/v1/internal/audit-log`)
url.searchParams.set('limit', limit)
url.searchParams.set('offset', offset)
if (action) {
url.searchParams.set('action', action)
}
const response = await fetch(url.toString(), {
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Audit log proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen', entries: [] },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,40 @@
/**
* Consent Admin API Route - Deadlines Proxy
*/
import { NextRequest, NextResponse } from 'next/server'
const CONSENT_SERVICE_URL = process.env.CONSENT_SERVICE_URL || 'http://localhost:8081'
// Trigger deadline processing
export async function POST(request: NextRequest) {
try {
const authHeader = request.headers.get('Authorization')
const response = await fetch(`${CONSENT_SERVICE_URL}/api/v1/admin/deadlines/process`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
signal: AbortSignal.timeout(30000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Deadlines process proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,80 @@
/**
* Consent Admin API Route - Document Versions Proxy
*/
import { NextRequest, NextResponse } from 'next/server'
const CONSENT_SERVICE_URL = process.env.CONSENT_SERVICE_URL || 'http://localhost:8081'
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const { id } = await params
const authHeader = request.headers.get('Authorization')
const response = await fetch(`${CONSENT_SERVICE_URL}/api/v1/documents/${id}/versions`, {
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Versions proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen', versions: [] },
{ status: 503 }
)
}
}
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
try {
const { id } = await params
const authHeader = request.headers.get('Authorization')
const body = await request.json()
const response = await fetch(`${CONSENT_SERVICE_URL}/api/v1/documents/${id}/versions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data, { status: 201 })
} catch (error) {
console.error('Create version proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,75 @@
/**
* Consent Admin API Route - Documents Proxy
*
* Proxies requests to consent service documents endpoints
*/
import { NextRequest, NextResponse } from 'next/server'
const CONSENT_SERVICE_URL = process.env.CONSENT_SERVICE_URL || 'http://localhost:8081'
export async function GET(request: NextRequest) {
try {
const authHeader = request.headers.get('Authorization')
const response = await fetch(`${CONSENT_SERVICE_URL}/api/v1/internal/documents`, {
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
console.error('Consent service documents error:', response.status, errorText)
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Documents proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen', documents: [] },
{ status: 503 }
)
}
}
export async function POST(request: NextRequest) {
try {
const authHeader = request.headers.get('Authorization')
const body = await request.json()
const response = await fetch(`${CONSENT_SERVICE_URL}/api/v1/documents`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data, { status: 201 })
} catch (error) {
console.error('Create document proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,44 @@
/**
* Consent Admin API Route - Stats Proxy
*/
import { NextRequest, NextResponse } from 'next/server'
const CONSENT_SERVICE_URL = process.env.CONSENT_SERVICE_URL || 'http://localhost:8081'
export async function GET(request: NextRequest) {
try {
const authHeader = request.headers.get('Authorization')
const documentType = request.nextUrl.searchParams.get('document_type') || ''
const url = new URL(`${CONSENT_SERVICE_URL}/api/v1/internal/stats/consents`)
if (documentType) {
url.searchParams.set('document_type', documentType)
}
const response = await fetch(url.toString(), {
headers: {
'Content-Type': 'application/json',
...(authHeader ? { 'Authorization': authHeader } : {})
},
signal: AbortSignal.timeout(10000)
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Consent Service Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Stats proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Consent Service fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,46 @@
/**
* Version Approval History API Route
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}/approval-history`,
{
method: 'GET',
headers: {
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Approval history proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,49 @@
/**
* Approve Version API Route
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const body = await request.json().catch(() => ({}))
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}/approve`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Approve proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,49 @@
/**
* Publish Version API Route
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const body = await request.json().catch(() => ({}))
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}/publish`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Publish proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,49 @@
/**
* Reject Version API Route
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const body = await request.json()
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}/reject`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Reject proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,87 @@
/**
* Consent Version Detail API Route - Update/Delete version
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const body = await request.json()
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}`,
{
method: 'PUT',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Version update proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}`,
{
method: 'DELETE',
headers: {
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
return NextResponse.json({ success: true })
} catch (error) {
console.error('Version delete proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,47 @@
/**
* Submit Version for Review API Route
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function POST(
request: NextRequest,
{ params }: { params: Promise<{ versionId: string }> }
) {
try {
const { versionId } = await params
const response = await fetch(
`${BACKEND_URL}/api/consent/admin/versions/${versionId}/submit-review`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
signal: AbortSignal.timeout(30000),
}
)
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Submit review proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}

View File

@@ -0,0 +1,42 @@
/**
* Consent Versions API Route - Create new version
*/
import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.BACKEND_URL || 'http://localhost:8000'
export async function POST(request: NextRequest) {
try {
const body = await request.json()
const response = await fetch(`${BACKEND_URL}/api/consent/admin/versions`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
...(request.headers.get('Authorization')
? { Authorization: request.headers.get('Authorization')! }
: {}),
},
body: JSON.stringify(body),
signal: AbortSignal.timeout(30000),
})
if (!response.ok) {
const errorText = await response.text()
return NextResponse.json(
{ error: `Backend Error: ${response.status}`, details: errorText },
{ status: response.status }
)
}
const data = await response.json()
return NextResponse.json(data)
} catch (error) {
console.error('Version create proxy error:', error)
return NextResponse.json(
{ error: 'Verbindung zum Backend fehlgeschlagen' },
{ status: 503 }
)
}
}