LMS-BGN/docs/brainstorming-session-resul...

96 lines
6.3 KiB
Markdown

# Brainstorming Session Results — Backend untuk LMS-BGN (2025-11-12)
## Konteks & Tujuan
- Kondisi saat ini: frontend Next.js 14 (app router) sudah MVP; alur learner dasar berjalan.
- Tujuan sesi: merumuskan pendekatan backend yang cepat, aman, dan selaras dengan brownfield frontend untuk mendukung kursus, ujian, sertifikat, analytics, dan reward.
- Prinsip: quick-flow (iteratif), minim gesekan integrasi, kontrak API jelas, dapat berevolusi ke arsitektur lebih kuat.
## Fokus Brainstorm (ringkas)
- User Pain Points: data progres dan hasil ujian belum persist; sertifikat & email perlu backend; admin butuh laporan.
- Fitur Backend: CRUD kursus/modul/lesson, pengerjaan kuis/ujian, skor & ringkasan, generasi sertifikat, email kirim ulang, analytics dasar, export.
- Pendekatan Teknis:
- Tahap A (cepat): Next.js Route Handlers (`src/app/api/*`) dengan ORM (Prisma) dan DB lokal (SQLite/MySQL Laragon).
- Tahap B (mantap): Service backend terpisah (NestJS + PostgreSQL) + OpenAPI/JSON:API; migrasi bertahap.
- UX Operasional: API stabil untuk learner/admin; admin aman; observabilitas minimal.
- Nilai Bisnis: mempercepat penerbitan sertifikat dan pelaporan training; menjaga kualitas dapur.
- Diferensiasi: alur desktop yang nyaman, sertifikat otomatis, insight progress; evolusi ke reward.
- Risiko Teknis: skema data berubah, performa query, auth/session, email deliverability.
- Sukses: jalur utama persist (enroll → belajar → ujian → sertifikat), admin melihat ringkas progres, email kirim ulang sukses.
## Opsi Arsitektur & Pertimbangan
1) Next.js API Route Handlers (Tahap A)
- Pro: integrasi paling cepat dengan frontend; deployment satu artefak; reuse Typescript tipe; bisa mulai dengan SQLite.
- Kontra: keterbatasan pemisahan concern; scaling terbatas bila beban tinggi; coupling dengan web tier.
- Cocok untuk: MVP backend ringan, validasi kontrak, dan fitur sertifikat/email.
2) Backend Terpisah (NestJS/Express/Fastify) (Tahap B)
- Pro: arsitektur bersih; kontrol penuh atas middleware, auth, rate limit; scaling & observabilitas lebih baik.
- Kontra: biaya setup & dev lebih tinggi; perlu orkestrasi build/deploy.
- Cocok untuk: fase produksi, multi-tenant, beban tinggi, integrasi eksternal.
3) Serverless / BaaS (Supabase/Hasura/Firebase)
- Pro: time-to-market cepat; auth & storage siap; SQL/GraphQL out-of-the-box.
- Kontra: vendor lock-in; kompleksitas domain ujian/sertifikat; kebijakan compliance.
- Cocok untuk: spike cepat, atau komponen spesifik (auth/upload), bukan keseluruhan domain.
## Rekomendasi Jalur Quick-Flow
- Mulai Tahap A: Next.js API Route Handlers + Prisma.
- DB: **SQLite** untuk kecepatan lokal; opsi **MySQL Laragon** bila butuh concurrency; target migrasi **PostgreSQL** saat Tahap B.
- Email: Nodemailer dengan ENV (`SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `SMTP_SECURE`).
- Auth: sesi sederhana (cookie) di Tahap A; siapkan desain JWT/OAuth untuk Tahap B.
- Kontrak: tulis OpenAPI core endpoints; gunakan tipe shared (ts) agar konsisten FE/BE.
## Model Data (awal)
- `User`: id, name, email, role (learner/admin), createdAt.
- `Course`: id, title, description, prerequisites?, createdAt.
- `Module`: id, courseId, title, order, contentMeta.
- `Lesson`: id, moduleId, type (video/text/pdf), url/meta.
- `Quiz`: id, moduleId, questions[], scoring.
- `ExamSession`: id, courseId, userId, startedAt, finishedAt, score, status.
- `Certificate`: id, userId, courseId, issuedAt, status, url.
- `Progress`: userId, courseId, moduleId, percent, timeSpent, updatedAt.
- `Assignment`: id, courseId/moduleId, title, dueDate.
## Kontrak API (draft ringkas)
- Auth: `POST /api/auth/login`, `POST /api/auth/logout` (Tahap A sederhana).
- Course: `GET /api/courses`, `GET /api/courses/:id`, `POST /api/courses` (admin), `PUT/PATCH /api/courses/:id`.
- Module/Lesson: `GET /api/courses/:id/modules`, `GET /api/modules/:id/lessons`.
- Progress: `GET /api/progress/:courseId`, `POST /api/progress` (update modul: percent/timeSpent/complete).
- Quiz: `POST /api/quiz/:id/submit` → hasil & feedback.
- Exam: `POST /api/exams/:courseId/start`, `POST /api/exams/:sessionId/finish` → skor & summary.
- Certificate: `POST /api/certificates/:courseId/issue`, `POST /api/certificates/:id/resend-email`.
- Analytics: `GET /api/admin/analytics/overview`, `GET /api/admin/export/csv`.
## Email & Sertifikat (detail)
- Generator PDF: library (mis. `pdf-lib`/`pdfkit`) menghasilkan file ke storage (`/public/certificates` sementara).
- Resend email: gunakan Nodemailer; log sederhana (`email_logs`) untuk audit.
## Observabilitas & Keamanan (awal)
- Logging: minimal `pino`/console; audit event key (exam start/finish, certificate issued, email sent).
- Rate limit: middleware ringan untuk endpoint sensitif.
- Privacy: data peserta terbatas; tidak expose PII di log; ENV aman.
## Roadmap Implementasi Backend
- Sprint 1 (paralel FE): Progress API + Course/Module read, Quiz submit (demo), Email resend sertifikat.
- Sprint 2: ExamSession penuh + generate certificate + admin CRUD minimal.
- Sprint 3: Analytics overview + export CSV + harden auth + performa query.
- Sprint 4: Polishing, observabilitas, migrasi awal ke service backend (jika diperlukan).
## Risiko & Mitigasi
- Skema berubah: kontrak OpenAPI dan migration plan; gunakan Prisma migration.
- Performa: index tepat, batasi payload, caching ringan.
- Auth: mulai sederhana, desain untuk upgrade; audit akses admin.
- Email deliverability: konfigurasi SPF/DKIM di kemudian hari; fallback unduh PDF.
## Next Steps (Dokumentasi & Gate — tanpa implementasi)
1. Dokumentasikan skeleton OpenAPI minimal untuk endpoint inti (tanpa implementasi kode).
2. Ratifikasi model data awal di Tech Spec (status: rencana), tanpa commit skema.
3. Susun rencana ENV (`.env.local`) sebagai placeholder, tanpa kredensial nyata.
4. Petakan integrasi FE: jelaskan bagaimana `useProgressTracking` akan menggunakan kontrak API (tanpa menulis handler).
5. Definisikan Acceptance Gate untuk mulai backend: PRD & Tech Spec sign-off, skema data final, kesiapan DB & SMTP, alokasi waktu dev.
---
Catatan koreksi (2025-11-12): Dokumen ini berfungsi sebagai referensi ideasi non-implementasi. Semua langkah berorientasi dokumentasi/gate; eksekusi backend akan dimulai setelah gate terpenuhi dan disetujui.
---
Catatan: Sesi ini mengacu pada konteks brownfield (frontend sudah MVP) dan berorientasi quick-flow. Dokumen ini bukan spesifikasi final; gunakan bersama Tech Spec untuk eksekusi.