Web Profile Lab MMT Polinema
This is website profile and CMS(Content Management System) for Multimedia and Mobile Tech Laboratorium in Information Technology Politeknik Negeri Malang. Proyek ini dikembangkan untuk tugas akhir saya di semester 3. Dalam proyek ini peran saya adalah pengembang backend, di mana saya mengelola database, membuat api dan dokumentasi untuk kolaborasi yang lebih mudah dengan tim frontend, dan memastikan semua data yang diperlukan untuk profil situs web dan sistem manajemen konten aman dan tersedia
2025
Situs Web
PHP Native, MySQL, JWT, MVC, Postman, Docker
Masalah
Laboratorium Multimedia dan Mobile Technology (Lab MMT) Politeknik Negeri Malang membutuhkan platform web resmi yang tidak hanya menampilkan profil, riset, dan karya mahasiswa (termasuk aset interaktif 3D), tetapi juga menyediakan sistem Content Management System (CMS) mandiri bagi pengurus lab. Sebagian besar framework PHP modern membawa overhead yang besar untuk deployment server kampus yang spesifik. Selain itu, sistem profil lab membutuhkan struktur data yang kompleks: manajemen anggota proyek, hierarki struktur organisasi, publikasi berita dengan sistem komentar, aset 3D, serta integrasi role-based access control (RBAC) yang granular untuk pengurus dan kontributor.
Peran saya
Proyek ini dikembangkan sebagai tugas akhir Semester 3 dalam tim. Saya memegang peran utama sebagai Lead Backend Engineer, bertanggung jawab penuh atas perancangan arsitektur backend, basis data, dan dokumentasi REST API dari nol (from scratch):
- Arsitektur Custom MVC PHP 8 (No Framework): Merancang dan membangun arsitektur MVC native tanpa framework (Laravel/CodeIgniter), mengimplementasikan custom Router dengan regex dinamis, Middleware Pipeline (CORS, JWT Auth, Role Gate), serta Request/Response lifecycle.
- Pola Desain 3-Tier (Controller – Service – Repository): Memisahkan logika bisnis dari akses basis data menggunakan Repository Pattern dengan PDO prepared statements untuk menjamin keamanan dari SQL Injection.
- Autentikasi & RBAC Granular: Mengintegrasikan Firebase JWT (
firebase/php-jwt) untuk autentikasi stateless berbasis Bearer Token, dilengkapi skemaroles,permissions, dan relasirole_permissionsuntuk pembatasan hak akses setiap endpoint admin. - Manajemen Aset Statis & Model 3D: Mengembangkan endpoint upload dan validasi file untuk aset media publik (gambar, dokumen, avatar) serta model 3D (GLTF/GLB), dilengkapi mekanisme direct-serve bypass pada web server untuk streaming aset 3D dengan throughput tinggi.
- Sistem Migrasi Database & Dokumentasi API: Merancang skrip migrasi database SQL otomatis (
php scripts/migrate.php) dan mendokumentasikan puluhan endpoint REST API di Postman untuk kelancaran integrasi tim frontend.
Arsitektur sistem
Backend dirancang ringan, aman, dan mudah di-deploy di berbagai lingkungan server (termasuk Docker):
- Core Framework Buatan Sendiri:
Router: Mendukung pendaftaran rute bertingkat ($router->group('/api/v1', ...)), penangkapan parameter URL dinamis ({id}), dan pengikatan middleware per rute.MiddlewarePipeline: Menjalankan rantai pengecekan request secara berurutan (CorsMiddleware$\to$AuthMiddleware$\to$RoleMiddleware).ErrorHandler: Menangkap semua exception dan error PHP untuk diformat menjadi respon JSON seragam (ResponseFormatter).
- Lapisan Data (MySQL via PDO): Seluruh query database dibungkus dalam repository class khusus, memastikan sanitasi input dan pemisahan tanggung jawab (separation of concerns).
- Direct Asset Streaming Bypass: Request file media (
/uploads/,/3D/,/carousel/,/struktur/) dialihkan langsung sebelum memuat siklus hidup aplikasi PHP, meminimalkan penggunaan RAM saat browser me-render aset model 3D.
Endpoint utama
Berikut adalah representasi endpoint penting dari 20+ resource yang tersedia:
| Method | Path | Fungsi & Hak Akses |
|---|---|---|
POST |
/api/v1/login |
Autentikasi user dan penerbitan token JWT Bearer |
GET |
/api/v1/validate-token |
Verifikasi validitas token JWT aktif |
GET |
/api/v1/projects |
Mengambil daftar portofolio & riset lab (Publik) |
POST |
/api/v1/projects |
Membuat entri proyek riset baru (Admin / Auth) |
POST |
/api/v1/project-members |
Menautkan mahasiswa/dosen ke dalam proyek |
GET |
/api/v1/media-3d-assets |
Mengambil daftar aset model 3D untuk WebGL/Three.js |
POST |
/api/v1/media-3d-assets/upload |
Upload file model 3D dengan validasi tipe mime & ukuran |
GET |
/api/v1/struktur-organisasi |
Menampilkan hierarki pengurus laboratorium (Publik) |
POST |
/api/v1/comments |
Menambahkan komentar diskusi pada berita/karya |
GET |
/api/v1/analytics/summary |
Dashboard analitik ringkasan pengunjung dan interaksi lab |
Tantangan teknis
1. Membangun Router dan Dependency Injection tanpa framework.
Tanpa bantuan framework seperti Laravel, penanganan URI dinamis seperti /api/v1/users/{id} dan nested query string harus dipecahkan sendiri. Solusinya, router mengonversi placeholder {parameter} menjadi ekspresi reguler (regex capture groups), mencocokkan HTTP Method, mengekstraksi nilai parameter ke dalam objek Request, dan mengeksekusi controller melalui refleksi class PHP.
2. Penanganan file upload model 3D berukuran besar.
Aset 3D untuk showcase laboratorium memiliki ukuran file yang jauh lebih besar dibanding gambar biasa. Dibuat service khusus Media3DAssetService yang memvalidasi header biner file, melakukan sanitasi nama file unik untuk mencegah path traversal, serta memisahkan direktori penyimpanan file statis agar dapat diakses langsung oleh server HTTP tanpa melewati overhead komputasi PHP.
3. Keamanan autentikasi dan otorisasi bertingkat.
Setiap token JWT di-decode dan divalidasi terhadap waktu kedaluwarsa (exp), issued-at (iat), dan signature key rahasia di environment server. RoleMiddleware secara dinamis memeriksa apakah peran user yang tertera di payload token memiliki izin akses terhadap modul tertentu sebelum controller dijalankan, mencegah eskalasi hak akses (privilege escalation).
4. Skalabilitas struktur data relasional. Sistem mengelola relasi banyak-ke-banyak (many-to-many) antara proyek dan anggota, kategori, serta tag pencarian. Di dalam repositori, query relasi dioptimalkan menggunakan prepared statement dengan parameterized placeholder untuk mencegah N+1 query problem secara manual saat mengembalikan payload JSON lengkap ke tim frontend.
Yang ingin saya perbaiki
- Menambahkan query builder sederhana untuk mengurangi redundansi penulisan sintaks SQL mentah di dalam repository.
- Mengimplementasikan automated unit test untuk router dan middleware menggunakan PHPUnit.
- Menambahkan rate limiting berbasis IP atau token untuk melindungi endpoint autentikasi dari serangan brute-force.
Proyek Lainnya

Backend platform kesehatan mental: analisis emosi diari berbasis AI, konsultasi psikolog, dan pemetaan stres per wilayah.
- Node.js
- Express
- Sequelize
- +3

Marketplace penjahit yang dibangun saat magang di Unimasoft: pesanan, pelacakan progres, chat, dan pembayaran nontunai.
- Laravel 11
- Livewire
- MySQL
- +2

API perpustakaan digital: peminjaman, permintaan buku, akun premium, dan pembayaran denda nontunai.
- Node.js
- Express
- MySQL
- +3