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.
236 lines
5.6 KiB
TypeScript
236 lines
5.6 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
|
|
/**
|
|
* SDK Checkpoints API
|
|
*
|
|
* GET /api/sdk/v1/checkpoints - Get all checkpoint statuses
|
|
* POST /api/sdk/v1/checkpoints - Validate a checkpoint
|
|
*/
|
|
|
|
// Checkpoint definitions
|
|
const CHECKPOINTS = {
|
|
'CP-PROF': {
|
|
id: 'CP-PROF',
|
|
step: 'company-profile',
|
|
name: 'Unternehmensprofil Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-UC': {
|
|
id: 'CP-UC',
|
|
step: 'use-case-assessment',
|
|
name: 'Anwendungsfall Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-SCAN': {
|
|
id: 'CP-SCAN',
|
|
step: 'screening',
|
|
name: 'Screening Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-MOD': {
|
|
id: 'CP-MOD',
|
|
step: 'modules',
|
|
name: 'Modules Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-REQ': {
|
|
id: 'CP-REQ',
|
|
step: 'requirements',
|
|
name: 'Requirements Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-CTRL': {
|
|
id: 'CP-CTRL',
|
|
step: 'controls',
|
|
name: 'Controls Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'DSB',
|
|
},
|
|
'CP-EVI': {
|
|
id: 'CP-EVI',
|
|
step: 'evidence',
|
|
name: 'Evidence Checkpoint',
|
|
type: 'RECOMMENDED',
|
|
blocksProgress: false,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-CHK': {
|
|
id: 'CP-CHK',
|
|
step: 'audit-checklist',
|
|
name: 'Checklist Checkpoint',
|
|
type: 'RECOMMENDED',
|
|
blocksProgress: false,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-RISK': {
|
|
id: 'CP-RISK',
|
|
step: 'risks',
|
|
name: 'Risk Matrix Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'DSB',
|
|
},
|
|
'CP-AI': {
|
|
id: 'CP-AI',
|
|
step: 'ai-act',
|
|
name: 'AI Act Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'LEGAL',
|
|
},
|
|
'CP-DSFA': {
|
|
id: 'CP-DSFA',
|
|
step: 'dsfa',
|
|
name: 'DSFA Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'DSB',
|
|
},
|
|
'CP-TOM': {
|
|
id: 'CP-TOM',
|
|
step: 'tom',
|
|
name: 'TOMs Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'NONE',
|
|
},
|
|
'CP-VVT': {
|
|
id: 'CP-VVT',
|
|
step: 'vvt',
|
|
name: 'VVT Checkpoint',
|
|
type: 'REQUIRED',
|
|
blocksProgress: true,
|
|
requiresReview: 'DSB',
|
|
},
|
|
}
|
|
|
|
export async function GET() {
|
|
try {
|
|
return NextResponse.json({
|
|
success: true,
|
|
checkpoints: CHECKPOINTS,
|
|
count: Object.keys(CHECKPOINTS).length,
|
|
})
|
|
} catch (error) {
|
|
console.error('Failed to get checkpoints:', error)
|
|
return NextResponse.json(
|
|
{ error: 'Failed to get checkpoints' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|
|
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json()
|
|
const { checkpointId, state, context } = body
|
|
|
|
if (!checkpointId) {
|
|
return NextResponse.json(
|
|
{ error: 'checkpointId is required' },
|
|
{ status: 400 }
|
|
)
|
|
}
|
|
|
|
const checkpoint = CHECKPOINTS[checkpointId as keyof typeof CHECKPOINTS]
|
|
|
|
if (!checkpoint) {
|
|
return NextResponse.json(
|
|
{ error: 'Checkpoint not found', checkpointId },
|
|
{ status: 404 }
|
|
)
|
|
}
|
|
|
|
// Perform validation based on checkpoint
|
|
const errors: Array<{ ruleId: string; field: string; message: string; severity: string }> = []
|
|
const warnings: Array<{ ruleId: string; field: string; message: string; severity: string }> = []
|
|
|
|
// Basic validation rules
|
|
switch (checkpointId) {
|
|
case 'CP-UC':
|
|
if (!state?.useCases || state.useCases.length === 0) {
|
|
errors.push({
|
|
ruleId: 'uc-min-count',
|
|
field: 'useCases',
|
|
message: 'Mindestens ein Use Case muss erstellt werden',
|
|
severity: 'ERROR',
|
|
})
|
|
}
|
|
break
|
|
|
|
case 'CP-SCAN':
|
|
if (!state?.screening || state.screening.status !== 'COMPLETED') {
|
|
errors.push({
|
|
ruleId: 'scan-complete',
|
|
field: 'screening',
|
|
message: 'Security Scan muss abgeschlossen sein',
|
|
severity: 'ERROR',
|
|
})
|
|
}
|
|
break
|
|
|
|
case 'CP-MOD':
|
|
if (!state?.modules || state.modules.length === 0) {
|
|
errors.push({
|
|
ruleId: 'mod-min-count',
|
|
field: 'modules',
|
|
message: 'Mindestens ein Modul muss zugewiesen werden',
|
|
severity: 'ERROR',
|
|
})
|
|
}
|
|
break
|
|
|
|
case 'CP-RISK':
|
|
if (state?.risks) {
|
|
const criticalRisks = state.risks.filter(
|
|
(r: { severity: string; mitigation: unknown[] }) =>
|
|
(r.severity === 'CRITICAL' || r.severity === 'HIGH') && r.mitigation.length === 0
|
|
)
|
|
if (criticalRisks.length > 0) {
|
|
errors.push({
|
|
ruleId: 'critical-risks-mitigated',
|
|
field: 'risks',
|
|
message: `${criticalRisks.length} kritische Risiken ohne Mitigationsmaßnahmen`,
|
|
severity: 'ERROR',
|
|
})
|
|
}
|
|
}
|
|
break
|
|
}
|
|
|
|
const passed = errors.length === 0
|
|
|
|
const result = {
|
|
checkpointId,
|
|
passed,
|
|
validatedAt: new Date().toISOString(),
|
|
validatedBy: context?.userId || 'SYSTEM',
|
|
errors,
|
|
warnings,
|
|
checkpoint,
|
|
}
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
...result,
|
|
})
|
|
} catch (error) {
|
|
console.error('Failed to validate checkpoint:', error)
|
|
return NextResponse.json(
|
|
{ error: 'Failed to validate checkpoint' },
|
|
{ status: 500 }
|
|
)
|
|
}
|
|
}
|