/** * Academy API — Mock Data & SDK Proxy * * Fallback mock data for development and SDK proxy function */ import type { Course, CourseCategory, Enrollment, EnrollmentStatus, AcademyStatistics, } from './types' import { isEnrollmentOverdue } from './types' import { fetchCourses, fetchEnrollments, fetchAcademyStatistics, } from './api-courses' // ============================================================================= // SDK PROXY FUNCTION // ============================================================================= export async function fetchSDKAcademyList(): Promise<{ courses: Course[] enrollments: Enrollment[] statistics: AcademyStatistics }> { try { const [courses, enrollments, statistics] = await Promise.all([ fetchCourses(), fetchEnrollments(), fetchAcademyStatistics() ]) return { courses, enrollments, statistics } } catch (error) { console.error('Failed to load Academy data from backend, using mock data:', error) const courses = createMockCourses() const enrollments = createMockEnrollments() const statistics = createMockStatistics(courses, enrollments) return { courses, enrollments, statistics } } } // ============================================================================= // MOCK DATA // ============================================================================= export function createMockCourses(): Course[] { const now = new Date() return [ { id: 'course-001', title: 'DSGVO-Grundlagen fuer Mitarbeiter', description: 'Umfassende Einfuehrung in die Datenschutz-Grundverordnung. Dieses Pflichttraining vermittelt die wichtigsten Grundsaetze des Datenschutzes, Betroffenenrechte und die korrekte Handhabung personenbezogener Daten im Arbeitsalltag.', category: 'dsgvo_basics', durationMinutes: 90, passingScore: 80, isActive: true, status: 'published', requiredForRoles: ['all'], createdAt: new Date(now.getTime() - 90 * 24 * 60 * 60 * 1000).toISOString(), updatedAt: new Date(now.getTime() - 5 * 24 * 60 * 60 * 1000).toISOString(), lessons: [ { id: 'lesson-001-01', courseId: 'course-001', order: 1, title: 'Was ist die DSGVO?', type: 'text', contentMarkdown: '# Was ist die DSGVO?\n\nDie Datenschutz-Grundverordnung (DSGVO) ist eine Verordnung der Europaeischen Union...', durationMinutes: 15 }, { id: 'lesson-001-02', courseId: 'course-001', order: 2, title: 'Die 7 Grundsaetze der DSGVO', type: 'video', contentMarkdown: 'Videoerklaerung der Grundsaetze: Rechtmaessigkeit, Zweckbindung, Datenminimierung, Richtigkeit, Speicherbegrenzung, Integritaet und Vertraulichkeit, Rechenschaftspflicht.', durationMinutes: 20, videoUrl: '/videos/dsgvo-grundsaetze.mp4' }, { id: 'lesson-001-03', courseId: 'course-001', order: 3, title: 'Betroffenenrechte (Art. 15-21)', type: 'text', contentMarkdown: '# Betroffenenrechte\n\nUebersicht der Betroffenenrechte: Auskunft, Berichtigung, Loeschung, Einschraenkung, Datenuebertragbarkeit, Widerspruch.', durationMinutes: 20 }, { id: 'lesson-001-04', courseId: 'course-001', order: 4, title: 'Personenbezogene Daten im Arbeitsalltag', type: 'video', contentMarkdown: 'Praxisbeispiele fuer den korrekten Umgang mit personenbezogenen Daten am Arbeitsplatz.', durationMinutes: 15, videoUrl: '/videos/dsgvo-praxis.mp4' }, { id: 'lesson-001-05', courseId: 'course-001', order: 5, title: 'Wissenstest: DSGVO-Grundlagen', type: 'quiz', contentMarkdown: 'Testen Sie Ihr Wissen zu den DSGVO-Grundlagen.', durationMinutes: 20 }, ] }, { id: 'course-002', title: 'IT-Sicherheit & Cybersecurity Awareness', description: 'Sensibilisierung fuer IT-Sicherheitsrisiken und Best Practices im Umgang mit Phishing, Passwoertern, Social Engineering und sicherer Kommunikation.', category: 'it_security', durationMinutes: 60, passingScore: 75, isActive: true, status: 'published', requiredForRoles: ['all'], createdAt: new Date(now.getTime() - 60 * 24 * 60 * 60 * 1000).toISOString(), updatedAt: new Date(now.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString(), lessons: [ { id: 'lesson-002-01', courseId: 'course-002', order: 1, title: 'Phishing erkennen und vermeiden', type: 'video', contentMarkdown: 'Wie erkennt man Phishing-E-Mails und was tut man im Verdachtsfall?', durationMinutes: 15, videoUrl: '/videos/phishing-awareness.mp4' }, { id: 'lesson-002-02', courseId: 'course-002', order: 2, title: 'Sichere Passwoerter und MFA', type: 'text', contentMarkdown: '# Sichere Passwoerter\n\nRichtlinien fuer starke Passwoerter, Passwort-Manager und Multi-Faktor-Authentifizierung.', durationMinutes: 15 }, { id: 'lesson-002-03', courseId: 'course-002', order: 3, title: 'Social Engineering und Manipulation', type: 'text', contentMarkdown: '# Social Engineering\n\nMethoden von Angreifern zur Manipulation von Mitarbeitern und Schutzmassnahmen.', durationMinutes: 15 }, { id: 'lesson-002-04', courseId: 'course-002', order: 4, title: 'Wissenstest: IT-Sicherheit', type: 'quiz', contentMarkdown: 'Testen Sie Ihr Wissen zur IT-Sicherheit.', durationMinutes: 15 }, ] }, { id: 'course-003', title: 'AI Literacy - Sicherer Umgang mit KI', description: 'Grundlagen kuenstlicher Intelligenz, EU AI Act, verantwortungsvoller Einsatz von KI-Werkzeugen und Risiken bei der Nutzung von Large Language Models (LLMs) im Unternehmen.', category: 'ai_literacy', durationMinutes: 75, passingScore: 70, isActive: true, status: 'draft', requiredForRoles: ['admin', 'data_protection_officer'], createdAt: new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000).toISOString(), updatedAt: new Date(now.getTime() - 3 * 24 * 60 * 60 * 1000).toISOString(), lessons: [ { id: 'lesson-003-01', courseId: 'course-003', order: 1, title: 'Was ist Kuenstliche Intelligenz?', type: 'text', contentMarkdown: '# Was ist KI?\n\nGrundlagen von Machine Learning, Deep Learning und Large Language Models in verstaendlicher Sprache.', durationMinutes: 15 }, { id: 'lesson-003-02', courseId: 'course-003', order: 2, title: 'Der EU AI Act - Was bedeutet er fuer uns?', type: 'video', contentMarkdown: 'Ueberblick ueber den EU AI Act, Risikoklassen und Anforderungen fuer Unternehmen.', durationMinutes: 20, videoUrl: '/videos/eu-ai-act.mp4' }, { id: 'lesson-003-03', courseId: 'course-003', order: 3, title: 'KI-Werkzeuge sicher nutzen', type: 'text', contentMarkdown: '# KI-Werkzeuge sicher nutzen\n\nRichtlinien fuer den Einsatz von ChatGPT, Copilot & Co.', durationMinutes: 20 }, { id: 'lesson-003-04', courseId: 'course-003', order: 4, title: 'Wissenstest: AI Literacy', type: 'quiz', contentMarkdown: 'Testen Sie Ihr Wissen zum sicheren Umgang mit KI.', durationMinutes: 20 }, ] } ] } export function createMockEnrollments(): Enrollment[] { const now = new Date() return [ { id: 'enr-001', courseId: 'course-001', userId: 'user-001', userName: 'Maria Fischer', userEmail: 'maria.fischer@example.de', status: 'in_progress', progress: 40, startedAt: new Date(now.getTime() - 10 * 24 * 60 * 60 * 1000).toISOString(), deadline: new Date(now.getTime() + 20 * 24 * 60 * 60 * 1000).toISOString() }, { id: 'enr-002', courseId: 'course-002', userId: 'user-002', userName: 'Stefan Mueller', userEmail: 'stefan.mueller@example.de', status: 'completed', progress: 100, startedAt: new Date(now.getTime() - 20 * 24 * 60 * 60 * 1000).toISOString(), completedAt: new Date(now.getTime() - 12 * 24 * 60 * 60 * 1000).toISOString(), certificateId: 'cert-001', deadline: new Date(now.getTime() + 10 * 24 * 60 * 60 * 1000).toISOString() }, { id: 'enr-003', courseId: 'course-001', userId: 'user-003', userName: 'Laura Schneider', userEmail: 'laura.schneider@example.de', status: 'not_started', progress: 0, startedAt: new Date(now.getTime() - 2 * 24 * 60 * 60 * 1000).toISOString(), deadline: new Date(now.getTime() + 28 * 24 * 60 * 60 * 1000).toISOString() }, { id: 'enr-004', courseId: 'course-003', userId: 'user-004', userName: 'Thomas Wagner', userEmail: 'thomas.wagner@example.de', status: 'expired', progress: 25, startedAt: new Date(now.getTime() - 60 * 24 * 60 * 60 * 1000).toISOString(), deadline: new Date(now.getTime() - 5 * 24 * 60 * 60 * 1000).toISOString() }, { id: 'enr-005', courseId: 'course-002', userId: 'user-005', userName: 'Julia Becker', userEmail: 'julia.becker@example.de', status: 'in_progress', progress: 50, startedAt: new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000).toISOString(), deadline: new Date(now.getTime() + 5 * 24 * 60 * 60 * 1000).toISOString() }, ] } export function createMockStatistics(courses?: Course[], enrollments?: Enrollment[]): AcademyStatistics { const c = courses || createMockCourses() const e = enrollments || createMockEnrollments() const completedCount = e.filter(en => en.status === 'completed').length const completionRate = e.length > 0 ? Math.round((completedCount / e.length) * 100) : 0 const overdueCount = e.filter(en => isEnrollmentOverdue(en)).length return { totalCourses: c.length, totalEnrollments: e.length, completionRate, overdueCount, byCategory: { dsgvo_basics: c.filter(co => co.category === 'dsgvo_basics').length, it_security: c.filter(co => co.category === 'it_security').length, ai_literacy: c.filter(co => co.category === 'ai_literacy').length, whistleblower_protection: c.filter(co => co.category === 'whistleblower_protection').length, custom: c.filter(co => co.category === 'custom').length, }, byStatus: { not_started: e.filter(en => en.status === 'not_started').length, in_progress: e.filter(en => en.status === 'in_progress').length, completed: e.filter(en => en.status === 'completed').length, expired: e.filter(en => en.status === 'expired').length, } } }