Alfi Anfahsa
← All projects

Praktis

Role —
Scrum Master & Full-Stack Engineer
Date —
September 30, 2025
Stack —
React, Express, MySQL, MongoDB, Docker

Praktis is a full-stack Learning Management System (LMS) engineered specifically for university computer science courses. Built to support multi-role academic workflows (Admins, Teaching Assistants / Asdos, and Students / Mahasiswa), the platform simplifies session scheduling, assignment collection, and course administration.

As Scrum Master, I facilitated team execution while actively contributing across backend architecture, security middleware, and environment containerization.


Architectural Highlight: Dual-Database Persistence

To balance relational integrity with document flexibility, Praktis uses a hybrid database strategy:

  • Relational Core (MySQL / Sequelize): Manages relational domain data requiring strict transactional consistency—such as user accounts, role enrollments (PraktikumUserRole), class definitions, and scheduled sessions (Pertemuan).
  • Document Store (MongoDB / Mongoose): Manages unstructured, schema-flexible resources—such as learning modules (Materi), assignments (Tugas), student submissions, active user session tokens, and APM observability logs.

Key Features & Technical Accomplishments

1. 5-Layer File Upload Anti-Abuse System

To prevent server storage exhaustion and malicious uploads on local disk storage:

  • Per-User Quota Guard: Enforces a strict 100 MB total active storage allocation per student.
  • Upload Rate Limiting: Restricts upload requests to 10 attempts per 15 minutes per IP.
  • Double MIME & Extension Verification: Validates file extensions (.pdf, .docx, .zip, etc.) alongside browser MIME types.
  • Storage Protection & Error Handling: Enforces a 5 GB global system-wide cap and intercepts OS ENOSPC disk errors with HTTP 507 responses to prevent Node.js crashes.
  • Filename Obfuscation: Strips internal timestamp prefixes (userId-timestamp-) from Content-Disposition headers so users download clean, human-readable file names.

2. Real-Time Schedule & Room Conflict Detector

Engineered a conflict detector for the Admin Dashboard calendar that flags overlapping room assignments and time slots, providing 1-click deep-linking into session resolution modals.

3. Full-Stack Docker Containerization

Dockerized the entire development stack (React Vite SPA, Express API, MySQL, and MongoDB) using docker-compose. This eliminated “works on my machine” issues across the team, automated volume persistence, and simplified database seeding scripts.


Ongoing Refactoring & Technical Lessons

Beyond initial delivery, I led efforts to refactor legacy controller patterns, upgrade query handling to modern Mongoose document models (returnDocument: 'after'), and optimize Docker build contexts for local development live-reloading.