# Patch Runtime Fase 4

Tanggal: 27 Juli 2026

## Tujuan

Memulihkan aplikasi yang menghasilkan HTTP 500 setelah integrasi Fase 4 tanpa mengganti arsitektur PHP native MVC atau menghapus fitur Fase 1–4.

## Penyebab Utama HTTP 500

1. `DashboardController` memanggil method model yang tidak tersedia:
   - `Praktikum::getAktif()`
   - `PraktikumHasil::getBestByUserAndPraktikum()`
2. Lima controller Fase 4 memakai `extends Controller` tanpa mengimpor `App\Core\Controller`, sehingga class induk diselesaikan sebagai `App\Controllers\Controller` yang tidak tersedia.
3. Controller Fase 4 tidak selalu mengirim data `$user` ke layout yang membutuhkannya.
4. `IntegratedProgressService` menggunakan konstanta `PDO` tanpa mengimpor class global `PDO`.
5. Sebagian route/form/fetch Fase 4 memakai URL absolut dari root domain, bukan base path aplikasi `/final_virtuallab/public`.
6. Inline JavaScript Fase 4 diblokir oleh Content Security Policy karena tidak memiliki nonce.

## Patch Tambahan

- Menormalkan kontrak method dashboard dengan model Praktikum yang tersedia.
- Menambahkan injeksi data user secara terpusat untuk layout terautentikasi.
- Membuat CSP nonce per request dan menerapkannya pada inline script.
- Memperbaiki typo status simulasi komposisi.
- Menambahkan streaming file Digital Project melalui route terproteksi dan ownership check.
- Memperkuat validasi upload Digital Project: `is_uploaded_file`, `finfo`, `getimagesize`, batas ukuran/dimensi, fallback ketika GD tidak tersedia, transaksi, dan rollback file.
- Menyinkronkan foto utama pada tabel file dan submission.
- Memperkuat penghapusan file dan pemilihan foto utama dengan transaksi.
- Memperkuat penilaian guru: whitelist status, nilai 0–100, komentar wajib untuk revisi, nilai wajib untuk selesai, dan transaksi.

## Verifikasi di Lingkungan Patch

- PHP lint seluruh source/test: lulus.
- JavaScript/MJS syntax check: lulus.
- Photography Engine: 22/22 lulus.
- Camera Capability: 7/7 lulus.
- Praktikum Evaluation: 6/6 lulus.
- Runtime Contract Fase 4: 24/24 lulus.
- View smoke test dashboard dan 18 view Fase 4: 20/20 lulus.

Acceptance HTTP dan MariaDB penuh tidak dapat direproduksi di lingkungan patch karena tidak tersedia server MariaDB dan ekstensi `pdo_mysql`. Pengujian tersebut wajib dilakukan melalui XAMPP pengguna.

## Langkah Pemasangan di XAMPP

1. Backup folder proyek lama dan database `virtual_lab_fotografi_v2`.
2. Ekstrak ZIP sehingga root proyek berada di:
   `D:\XAMPP\htdocs\final_virtuallab`
3. Jalankan:

```bat
cd D:\XAMPP\htdocs\final_virtuallab
D:\XAMPP\php\php.exe database\migrate.php
D:\XAMPP\php\php.exe database\seed.php
D:\XAMPP\php\php.exe tests\phase4_runtime_contract_test.php
D:\XAMPP\php\php.exe tests\phase4_acceptance.php
```

4. Buka `http://localhost/final_virtuallab/public/` dan lakukan hard refresh `Ctrl + F5`.
5. Uji login guru/siswa, kedua dashboard, Kuis, Komposisi, Digital Project, Praktikum, kamera, dan progres.
6. Periksa `storage/logs/app.log` setelah pengujian.
