Remove standalone services (ai-compliance-sdk root, developer-portal, dsms-gateway, dsms-node, night-scheduler) and legacy compliance/dsgvo pages. Add new SDK pipeline modules (academy, document-crawler, dsb-portal, incidents, whistleblower, reporting, sso, multi-tenant, industry-templates). Add drafting engine, legal corpus files (AT/CH/DE), pitch-deck, blog and Förderantrag pages. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
210 lines
8.5 KiB
Go
210 lines
8.5 KiB
Go
package api
|
|
|
|
// Academy Course models
|
|
|
|
// AcademyCourse represents a training course in the Academy module
|
|
type AcademyCourse struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId,omitempty"`
|
|
Title string `json:"title"`
|
|
Description string `json:"description"`
|
|
Category string `json:"category"`
|
|
PassingScore int `json:"passingScore"`
|
|
DurationMinutes int `json:"durationMinutes"`
|
|
RequiredForRoles []string `json:"requiredForRoles"`
|
|
Status string `json:"status"`
|
|
Lessons []AcademyLesson `json:"lessons"`
|
|
CreatedAt string `json:"createdAt"`
|
|
UpdatedAt string `json:"updatedAt"`
|
|
}
|
|
|
|
// AcademyLesson represents a single lesson within a course
|
|
type AcademyLesson struct {
|
|
ID string `json:"id"`
|
|
CourseID string `json:"courseId"`
|
|
Title string `json:"title"`
|
|
Type string `json:"type"` // video, text, quiz
|
|
ContentMarkdown string `json:"contentMarkdown"`
|
|
VideoURL string `json:"videoUrl,omitempty"`
|
|
AudioURL string `json:"audioUrl,omitempty"`
|
|
Order int `json:"order"`
|
|
DurationMinutes int `json:"durationMinutes"`
|
|
QuizQuestions []AcademyQuizQuestion `json:"quizQuestions,omitempty"`
|
|
}
|
|
|
|
// AcademyQuizQuestion represents a single quiz question within a lesson
|
|
type AcademyQuizQuestion struct {
|
|
ID string `json:"id"`
|
|
LessonID string `json:"lessonId"`
|
|
Question string `json:"question"`
|
|
Options []string `json:"options"`
|
|
CorrectOptionIndex int `json:"correctOptionIndex"`
|
|
Explanation string `json:"explanation"`
|
|
Order int `json:"order"`
|
|
}
|
|
|
|
// AcademyEnrollment represents a user's enrollment in a course
|
|
type AcademyEnrollment struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId,omitempty"`
|
|
CourseID string `json:"courseId"`
|
|
UserID string `json:"userId"`
|
|
UserName string `json:"userName"`
|
|
UserEmail string `json:"userEmail"`
|
|
Status string `json:"status"` // not_started, in_progress, completed, expired
|
|
Progress int `json:"progress"` // 0-100
|
|
StartedAt string `json:"startedAt"`
|
|
CompletedAt string `json:"completedAt,omitempty"`
|
|
CertificateID string `json:"certificateId,omitempty"`
|
|
Deadline string `json:"deadline"`
|
|
CreatedAt string `json:"createdAt,omitempty"`
|
|
UpdatedAt string `json:"updatedAt,omitempty"`
|
|
}
|
|
|
|
// AcademyCertificate represents a certificate issued upon course completion
|
|
type AcademyCertificate struct {
|
|
ID string `json:"id"`
|
|
TenantID string `json:"tenantId,omitempty"`
|
|
EnrollmentID string `json:"enrollmentId"`
|
|
CourseID string `json:"courseId"`
|
|
UserID string `json:"userId"`
|
|
UserName string `json:"userName"`
|
|
CourseName string `json:"courseName"`
|
|
Score int `json:"score"`
|
|
IssuedAt string `json:"issuedAt"`
|
|
ValidUntil string `json:"validUntil"`
|
|
PdfURL string `json:"pdfUrl,omitempty"`
|
|
}
|
|
|
|
// AcademyLessonProgress tracks a user's progress through a single lesson
|
|
type AcademyLessonProgress struct {
|
|
ID string `json:"id"`
|
|
EnrollmentID string `json:"enrollmentId"`
|
|
LessonID string `json:"lessonId"`
|
|
Completed bool `json:"completed"`
|
|
QuizScore *int `json:"quizScore,omitempty"`
|
|
CompletedAt string `json:"completedAt,omitempty"`
|
|
}
|
|
|
|
// AcademyStatistics provides aggregate statistics for the Academy module
|
|
type AcademyStatistics struct {
|
|
TotalCourses int `json:"totalCourses"`
|
|
TotalEnrollments int `json:"totalEnrollments"`
|
|
CompletionRate int `json:"completionRate"`
|
|
OverdueCount int `json:"overdueCount"`
|
|
ByCategory map[string]int `json:"byCategory"`
|
|
ByStatus map[string]int `json:"byStatus"`
|
|
}
|
|
|
|
// Request types
|
|
|
|
// CreateCourseRequest is the request body for creating a new course
|
|
type CreateCourseRequest struct {
|
|
TenantID string `json:"tenantId" binding:"required"`
|
|
Title string `json:"title" binding:"required"`
|
|
Description string `json:"description"`
|
|
Category string `json:"category" binding:"required"`
|
|
DurationMinutes int `json:"durationMinutes"`
|
|
RequiredForRoles []string `json:"requiredForRoles"`
|
|
PassingScore int `json:"passingScore"`
|
|
Lessons []CreateLessonRequest `json:"lessons"`
|
|
}
|
|
|
|
// CreateLessonRequest is the request body for creating a lesson within a course
|
|
type CreateLessonRequest struct {
|
|
Title string `json:"title" binding:"required"`
|
|
Type string `json:"type" binding:"required"`
|
|
ContentMarkdown string `json:"contentMarkdown"`
|
|
VideoURL string `json:"videoUrl"`
|
|
Order int `json:"order"`
|
|
DurationMinutes int `json:"durationMinutes"`
|
|
QuizQuestions []CreateQuizQuestionRequest `json:"quizQuestions"`
|
|
}
|
|
|
|
// CreateQuizQuestionRequest is the request body for creating a quiz question
|
|
type CreateQuizQuestionRequest struct {
|
|
Question string `json:"question" binding:"required"`
|
|
Options []string `json:"options" binding:"required"`
|
|
CorrectOptionIndex int `json:"correctOptionIndex"`
|
|
Explanation string `json:"explanation"`
|
|
Order int `json:"order"`
|
|
}
|
|
|
|
// UpdateCourseRequest is the request body for updating an existing course
|
|
type UpdateCourseRequest struct {
|
|
Title *string `json:"title"`
|
|
Description *string `json:"description"`
|
|
Category *string `json:"category"`
|
|
DurationMinutes *int `json:"durationMinutes"`
|
|
RequiredForRoles []string `json:"requiredForRoles"`
|
|
PassingScore *int `json:"passingScore"`
|
|
}
|
|
|
|
// EnrollUserRequest is the request body for enrolling a user in a course
|
|
type EnrollUserRequest struct {
|
|
TenantID string `json:"tenantId" binding:"required"`
|
|
CourseID string `json:"courseId" binding:"required"`
|
|
UserID string `json:"userId" binding:"required"`
|
|
UserName string `json:"userName" binding:"required"`
|
|
UserEmail string `json:"userEmail" binding:"required"`
|
|
Deadline string `json:"deadline" binding:"required"`
|
|
}
|
|
|
|
// UpdateProgressRequest is the request body for updating enrollment progress
|
|
type UpdateProgressRequest struct {
|
|
Progress int `json:"progress"`
|
|
LessonID string `json:"lessonId"`
|
|
}
|
|
|
|
// SubmitQuizRequest is the request body for submitting quiz answers
|
|
type SubmitQuizRequest struct {
|
|
Answers []int `json:"answers" binding:"required"`
|
|
}
|
|
|
|
// SubmitQuizResponse is the response for a quiz submission
|
|
type SubmitQuizResponse struct {
|
|
Score int `json:"score"`
|
|
Passed bool `json:"passed"`
|
|
CorrectAnswers int `json:"correctAnswers"`
|
|
TotalQuestions int `json:"totalQuestions"`
|
|
Results []QuizQuestionResult `json:"results"`
|
|
}
|
|
|
|
// QuizQuestionResult represents the result of a single quiz question
|
|
type QuizQuestionResult struct {
|
|
QuestionID string `json:"questionId"`
|
|
Correct bool `json:"correct"`
|
|
Explanation string `json:"explanation"`
|
|
}
|
|
|
|
// GenerateCourseRequest is the request body for AI-generating a course
|
|
type GenerateCourseRequest struct {
|
|
TenantID string `json:"tenantId" binding:"required"`
|
|
Topic string `json:"topic" binding:"required"`
|
|
Category string `json:"category" binding:"required"`
|
|
TargetGroup string `json:"targetGroup"`
|
|
Language string `json:"language"`
|
|
UseRAG bool `json:"useRag"`
|
|
RAGQuery string `json:"ragQuery"`
|
|
}
|
|
|
|
// GenerateVideosRequest is the request body for generating lesson videos
|
|
type GenerateVideosRequest struct {
|
|
TenantID string `json:"tenantId" binding:"required"`
|
|
}
|
|
|
|
// VideoStatusResponse represents the video generation status for a course
|
|
type VideoStatusResponse struct {
|
|
CourseID string `json:"courseId"`
|
|
Status string `json:"status"` // pending, processing, completed, failed
|
|
Lessons []LessonVideoStatus `json:"lessons"`
|
|
}
|
|
|
|
// LessonVideoStatus represents the video generation status for a single lesson
|
|
type LessonVideoStatus struct {
|
|
LessonID string `json:"lessonId"`
|
|
Status string `json:"status"`
|
|
VideoURL string `json:"videoUrl,omitempty"`
|
|
AudioURL string `json:"audioUrl,omitempty"`
|
|
}
|