# Game Upload Testing Guide

## Masalah yang Ditemukan dan Diperbaiki

### 1. Validasi yang Salah

**Masalah**: Field `game_zip` menggunakan `nullable` pada create, sehingga form bisa submit tanpa file ZIP.
**Perbaikan**: Mengubah validasi menjadi `required` untuk create game baru.

### 2. Konflik Checkbox is_active

**Masalah**: Hidden input untuk `is_active` menyebabkan konflik dengan checkbox.
**Perbaikan**: Menghapus hidden input, menggunakan nullable validation.

### 3. Kurangnya Logging

**Masalah**: Sulit debug masalah upload karena tidak ada logging.
**Perbaikan**: Menambahkan logging lengkap di Controller dan GameZipService.

### 4. Permission Directory

**Masalah**: Directory `storage/app/games` belum ada.
**Perbaikan**: Membuat directory dengan permission yang benar (775).

## Perubahan yang Dilakukan

### 1. GameController.php

-   ✅ Validasi `game_zip` menjadi `required` untuk store
-   ✅ Validasi `is_active` menjadi `nullable` untuk menghindari konflik
-   ✅ Max file size dinaikkan menjadi 100MB (102400 KB)
-   ✅ Menambahkan logging untuk debugging
-   ✅ Game akan dihapus jika ZIP upload gagal (pada create)
-   ✅ Pesan error lebih jelas dalam Bahasa Indonesia

### 2. form.blade.php

-   ✅ Menghapus hidden input `is_active` yang menyebabkan konflik
-   ✅ Update hint menjadi "Max 100MB"

### 3. GameZipService.php

-   ✅ Menambahkan logging di setiap tahap proses
-   ✅ Memastikan directory `storage/app/games` dibuat jika belum ada
-   ✅ Better error handling dengan detailed logging

## Cara Testing

### Persiapan

1. Pastikan server development berjalan:

    ```bash
    php artisan serve
    ```

2. Login sebagai admin di `/admin/login`

### Test Case 1: Create Game Tanpa ZIP (Harus Gagal)

1. Buka `/admin/games/create`
2. Isi semua field KECUALI game_zip
3. Submit form
4. **Expected**: Error validation "The game zip field is required."

### Test Case 2: Create Game Dengan ZIP Valid

1. Buka `/admin/games/create`
2. Isi semua field:
    - Name: "Test Game"
    - Min Score: 0
    - Max Score: 100
    - Coin Reward: 10
    - Daily Limit: 5
    - Cooldown: 0
3. Upload file ZIP yang berisi:
    - index.html (di root)
    - File JS, CSS, gambar, dll
4. Centang "Game Aktif"
5. Submit form
6. **Expected**:
    - Success message
    - Game muncul di list
    - File terupload ke `storage/app/public/games/test-game/`
    - File dapat diakses via `public/storage/games/test-game/index.html`

### Test Case 3: Update Game Dengan ZIP Baru

1. Buka game yang sudah ada
2. Klik Edit
3. Upload ZIP baru
4. Submit form
5. **Expected**:
    - Success message
    - File lama terhapus
    - File baru terupload

### Test Case 4: Check Log Files

Jika ada masalah, cek log:

```bash
tail -f storage/logs/laravel.log
```

Look for:

-   "Processing game ZIP" - Saat mulai upload
-   "Game ZIP processed successfully" - Saat berhasil
-   "GameZipService:" prefix - Detail proses di service

## Struktur ZIP yang Valid

```
game.zip
├── index.html          (REQUIRED - harus ada di root)
├── css/
│   └── style.css
├── js/
│   └── game.js
├── images/
│   └── sprite.png
└── sounds/
    └── bgm.mp3
```

ATAU dengan folder wrapper:

```
game.zip
└── my-game/
    ├── index.html      (REQUIRED)
    ├── css/
    ├── js/
    └── images/
```

## File Type yang Diizinkan

-   HTML: .html, .htm
-   JavaScript: .js
-   CSS: .css
-   Images: .png, .jpg, .jpeg, .gif, .svg, .webp, .ico
-   Audio: .mp3, .wav, .ogg
-   Video: .mp4, .webm
-   Fonts: .woff, .woff2, .ttf, .eot
-   Other: .json, .txt, .md, .wasm

## File Type yang DILARANG

-   PHP: .php, .phtml, dll
-   Executable: .exe, .bat, .cmd, .sh
-   Config: .htaccess, .env, .ini
-   Database: .sql, .db, .sqlite
-   Scripts: .py, .rb, .pl

## PHP Configuration Requirements

Untuk upload file 100MB, pastikan php.ini memiliki setting:

```ini
upload_max_filesize = 128M
post_max_size = 128M      # PENTING: Harus lebih besar dari upload_max_filesize
max_execution_time = 300
memory_limit = 256M
```

**CURRENT STATUS**:

-   upload_max_filesize: 128M ✅
-   post_max_size: 64M ⚠️ (PERLU DINAIKKAN ke 128M)

## Troubleshooting

### Masalah: File tidak terupload

**Cek**:

1. Log Laravel: `tail -f storage/logs/laravel.log`
2. Permission: `ls -la storage/app/games`
3. Disk space: `df -h`
4. PHP settings: `php -i | grep upload`

### Masalah: "Failed to create temporary directory"

**Solusi**:

```bash
mkdir -p storage/app/temp
chmod 775 storage/app/temp
```

### Masalah: File tidak bisa diakses via URL

**Solusi**:
Pastikan symbolic link sudah dibuat:

```bash
php artisan storage:link
```

File game akan tersimpan di `storage/app/public/games/` dan dapat diakses via `public/storage/games/`

### Masalah: "Could not locate index.html after extraction"

**Solusi**:

-   Pastikan ZIP berisi index.html di root atau di folder pertama
-   Cek struktur ZIP: `unzip -l game.zip | head -20`

### Masalah: Form submit tapi file tidak terupload

**Cek**:

1. Form memiliki `enctype="multipart/form-data"` ✅
2. Input name="game_zip" ada ✅
3. File size tidak melebihi limit PHP ⚠️
4. Browser console untuk error JavaScript
5. Network tab di browser untuk melihat apakah file terkirim

## Next Steps

1. ✅ Update post_max_size di php.ini menjadi 128M
2. ✅ Restart PHP-FPM atau web server
3. ✅ Test upload file ZIP ~50MB
4. ✅ Test upload file ZIP ~90MB
5. ✅ Verify file terupload dengan benar
6. ✅ Test game dapat dimainkan

## Logs Location

-   Laravel logs: `storage/logs/laravel.log`
-   Web server logs: `/var/log/nginx/error.log` atau `/var/log/apache2/error.log`
