6.3 KiB
6.3 KiB
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.
- Tahap A (cepat): Next.js Route Handlers (
- 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
- 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.
- 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.
- 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/certificatessementara). - 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)
- Dokumentasikan skeleton OpenAPI minimal untuk endpoint inti (tanpa implementasi kode).
- Ratifikasi model data awal di Tech Spec (status: rencana), tanpa commit skema.
- Susun rencana ENV (
.env.local) sebagai placeholder, tanpa kredensial nyata. - Petakan integrasi FE: jelaskan bagaimana
useProgressTrackingakan menggunakan kontrak API (tanpa menulis handler). - 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.