# Spesifikasi Teknis — LMS-BGN (Frontend Next.js 14) Dihasilkan: 2025-11-12 Lintasan: quick-flow Level: 2 (Proyek Menengah) Jenis Bidang: brownfield > Catatan Koreksi (2025-11-12): Backend belum diimplementasikan pada fase ini. Semua rute API di dokumen ini bersifat rencana (non-implementasi). Pengiriman email "kirim ulang sertifikat" akan dilakukan setelah Acceptance Gate backend terpenuhi (PRD & Tech Spec sign-off, skema data final, ENV siap, alokasi waktu dev). Sementara itu, gunakan mock/JSON/Repo untuk data. ## 1. Tujuan & Ruang Lingkup - Menetapkan arsitektur, kontrak antarmuka, dan strategi implementasi untuk LMS-BGN. - Fokus pada frontend Next.js 14 (App Router) dengan TypeScript, Tailwind, dan modul fitur: kursus & belajar, assessment & sertifikasi, reward (phase-1, flagged), analytics admin, desktop UX, AI assistant (phase-1). ## 2. Konteks & Asumsi - Codebase frontend telah tersedia; backend penuh belum terintegrasi (gunakan mock/JSON/Repo interfaces sementara). - Pengiriman email “kirim ulang sertifikat” via rute API Next.js menggunakan ENV (Nodemailer). - Target utama: desktop-first; p95 waktu muat halaman utama < 2 detik. ## 3. Arsitektur Frontend - Framework: Next.js 14 App Router (`src/app/*`). - Styling: Tailwind CSS dengan token desain BGN (`tailwind.config.js`). - State: React Context (`AuthContext.tsx`, `ExamContext.tsx`) + hooks util (`useExamPersistence`, `useProgressTracking`). - Event bus: `src/core/events/SystemEvents.ts` untuk event bertipe antar fitur. - Feature flags: `src/config/featureFlags.ts` untuk modul opsional (reward, AI, dll.). - Modul utama: - Course & Learning: `src/app/course/*`, `src/components/course/*`. - Assessment & Sertifikasi: `src/app/exam-session/*`, `src/app/exam-summary/*`, `src/components/admin/CertificatePDF.tsx`. - Reward (Phase-1): `src/features/payroll-reward-system/*` (dashboard, services, repositories, types). - Analytics Admin: `src/app/admin/analytics/*`. - Desktop UX: polishing lintas halaman learner. - AI Assistant (Phase-1): `src/app/ai-assistant/page.tsx`. ## 4. Kontrak Antarmuka (TypeScript) Contoh tipe terpadu untuk interoperabilitas; simpan di `src/types/index.ts` (atau modul terkait): ```ts export interface Course { id: string; title: string; description?: string; modules: CourseModule[]; } export interface CourseModule { id: string; title: string; lessons: Lesson[]; } export interface Lesson { id: string; type: 'video' | 'text' | 'pdf'; durationMinutes?: number; } export interface ProgressRecord { userId: string; courseId: string; completedLessonIds: string[]; percent: number; // 0..100 learningHours?: number; } export interface QuizQuestion { id: string; type: 'single' | 'multiple'; prompt: string; options: { id: string; text: string }[]; correctOptionIds: string[]; } export interface ExamSession { id: string; courseId: string; userId: string; startedAt: string; // ISO expiresAt?: string; // ISO answers: Record; // per Question.id score?: number; } export interface CertificateData { id: string; userId: string; courseId: string; issuedAt: string; // ISO status: 'issued' | 'pending' | 'revoked'; } export interface RewardMetrics { userId: string; learningHours: number; lastUpdated: string; // ISO } ``` Prinsip: gunakan tipe terpadu di komponen, hooks, repositori layanan agar konsisten. ## 5. Event Sistem (contoh) - `COURSE_COMPLETED` (payload: `{ userId, courseId }`) → tingkatkan progres, evaluasi eligibility sertifikat. - `EXAM_COMPLETED` (payload: `{ userId, sessionId, score }`) → hasil ujian & kelulusan. - `CERTIFICATE_ISSUED` (payload: `{ certificateId }`) → tampilkan unduh, opsi kirim ulang. - `REWARD_UPDATED` (payload: `{ userId, learningHours }`) → sinkron dashboard reward. ## 6. Feature Flags - `rewardEnabled`: mengaktifkan modul reward (phase-1). - `aiAssistantEnabled`: mengaktifkan halaman AI assistant (opsional). - `certificateEmailResendEnabled`: menampilkan aksi kirim ulang sertifikat. ## 7. Rute API Sertifikat (Resend) - Path: `POST /api/certificates/[id]/resend`. - Input: `id` di path; body opsional (mis. `email` override); validasi sederhana. - ENV: `SMTP_HOST`, `SMTP_PORT`, `SMTP_SECURE`, `SMTP_USER`, `SMTP_PASS`. - Response: `200` sukses; `400` input invalid; `404` tidak ditemukan; `500` error kirim. ## 8. Performa & Optimisasi - Target: p95 < 2 detik di halaman utama learner. - Praktik: code-splitting komponen berat (mis. grafik, PDF); lazy-load multimedia; cache data ringan (React Query jika dipakai); minimalkan re-render via `memo`/`useMemo`. ## 9. Keamanan & Privasi - ENV disimpan aman; jangan hardcode kredensial. - Data peserta terbatas pada kebutuhan UI; hindari PII sensitif. - Validasi input form & sanitasi konten yang ditampilkan. ## 10. Pengujian - Unit: hooks (`useExamPersistence`, `useProgressTracking`), util, komponen kritis. - Integrasi: alur learner utama (buka course → lesson → kuis/ujian → sertifikat). - Snapshot/UI: komponen tabel & kartu utama. - Performance smoke: ukur waktu muat utama pada build produk. ## 11. Implementasi (Quick-Flow) - Sprint 1 (MLP): Course/lesson viewer, progres dasar, kuis interaktif sederhana. - Sprint 2: Ujian terjadwal + ringkasan; sertifikat PDF & unduh. - Sprint 3: Analytics admin ringkas + export CSV; kirim ulang sertifikat via API. - Sprint 4: Desktop UX polishing; reward dashboard (phase-1, flagged); AI assistant (opsional). ## 12. Risiko & Mitigasi - Konten tidak siap → gunakan template & libatkan trainer sejak awal. - Performa lambat di desktop lama → optimisasi asset, virtualisasi list, audit Tailwind kelas berat. - Email gagal kirim → fallback notifikasi & retry; validasi ENV di startup. ## 13. Ketergantungan & Konfigurasi - Next.js 14, React 18, TypeScript, Tailwind. - Nodemailer (rute API); `html2canvas` & `jspdf` untuk PDF jika diperlukan. - `tailwind.config.js`: gunakan palet BGN, ukuran font, bayangan untuk konsistensi. ## 14. Kriteria Selesai (Tech-Spec) - Tipe terpadu tersedia dan dipakai di komponen/fitur utama. - Rute API `resend` terdokumentasi dengan ENV jelas. - Feature flags terdokumentasi dan aktif sesuai kebutuhan. - Rencana sprint rinci terhubung ke backlog (`docs/mbg-lms-backlog.md`). ## 15. Referensi - `docs/bmm-index.md`, `docs/mbg-lms-prd.md`, `docs/mbg-lms-backlog.md`, `docs/mbg-lms-epic-plan.md`, `docs/mbg-lms-codebase-sync.md`.