Semua proyek

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

Tahun

2025

Kategori

Situs Web

Perkakas

PHP Native, MySQL, JWT, MVC, Postman, Docker

Studi Kasus

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 skema roles, permissions, dan relasi role_permissions untuk 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

Diagram arsitektur backend Lab MMT

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

↑↓ pilih↵ bukaesc tutup
fijri.my.id