Skip to content

Pengaturan global untuk menonaktifkan batas ukuran file upload#1610

Merged
affandii06 merged 3 commits into
rilis-devfrom
dev-1609
Jun 28, 2026
Merged

Pengaturan global untuk menonaktifkan batas ukuran file upload#1610
affandii06 merged 3 commits into
rilis-devfrom
dev-1609

Conversation

@habibie11

@habibie11 habibie11 commented Jun 26, 2026

Copy link
Copy Markdown
Contributor

issue # #1609

🎯 Deskripsi

Pull request ini mengimplementasikan fitur pengaturan global untuk menonaktifkan batas ukuran file upload pada semua form di aplikasi OpenDK, sesuai permintaan di issue terkait.

Sebelumnya, batas ukuran file upload tersebar secara hardcode di berbagai lokasi (controller, rule validasi, dan komponen Livewire), sehingga pengguna tidak dapat mengupload file berukuran besar meski secara teknis server mendukungnya. PR ini menambahkan satu pengaturan bertipe boolean toggle di halaman Pengaturan → Aplikasi yang memungkinkan Admin menonaktifkan semua pembatasan ukuran file secara serentak tanpa perlu mengubah kode.

Ketika toggle dinonaktifkan (Tidak Aktif), validasi ukuran file di seluruh lapisan aplikasi (service, rule, controller, dan Livewire) akan dilewati secara otomatis. Ketika diaktifkan kembali (Aktif), semua batas ukuran bawaan berlaku normal seperti semula.


🛠️ Perubahan yang Dilakukan

1. database/migrations/2026_06_26_160000_add_upload_limit_setting.php (BARU)

Menambahkan migration untuk menyisipkan baris pengaturan baru ke tabel das_setting:

SettingAplikasi::insert([
    'key'         => 'upload_limit',
    'value'       => '1',      // default: Aktif (limit berlaku)
    'type'        => 'boolean',
    'description' => 'Nonaktifkan untuk melepas batas ukuran file upload pada semua form.',
    'kategori'    => 'sistem',
    'option'      => '{}',
]);

Pengaturan ini langsung tampil di halaman Pengaturan → Aplikasi tanpa memerlukan perubahan view, karena view sudah menangani type boolean secara generik (ditampilkan sebagai dropdown Aktif / Tidak Aktif).


2. app/Services/FileUploadService.php

Fitur — Tambah method isLimitEnabled() dan update validateFileSize():

  • Menambahkan static method isLimitEnabled() yang membaca nilai key upload_limit dari tabel das_setting. Mengembalikan true jika limit berlaku, false jika dinonaktifkan. Default true jika setting belum ada (backward compatible).
  • Mengubah method validateFileSize() agar langsung return tanpa melakukan pengecekan ukuran ketika isLimitEnabled() bernilai false.
+ /**
+  * Cek apakah batas ukuran file upload aktif berdasarkan pengaturan aplikasi.
+  */
+ public static function isLimitEnabled(): bool
+ {
+     $value = \App\Models\SettingAplikasi::where('key', 'upload_limit')->value('value');
+     return (bool) (int) ($value ?? 1);
+ }

  protected function validateFileSize(UploadedFile $file, int $maxSize): void
  {
+     // Jika limit dinonaktifkan via Pengaturan Aplikasi, lewati validasi ukuran
+     if (! static::isLimitEnabled()) {
+         return;
+     }
+
      $fileSizeInKB = $file->getSize() / 1024;
      if ($fileSizeInKB > $maxSize) {
          throw new \InvalidArgumentException(
              "File size exceeds maximum allowed size of {$maxSize}KB"
          );
      }
  }

Semua caller yang mengoper $maxSize eksplisit (import ZIP 50MB, backup DB 100MB, upload theme) tidak terpengaruh — parameter tetap ada, hanya validasinya yang dilewati ketika setting dinonaktifkan.


3. app/Rules/SecureFileUpload.php

Fitur — Skip pengecekan ukuran file jika limit dinonaktifkan:

- // Check file size
- $sizeInKB = $value->getSize() / 1024;
- if ($sizeInKB > $this->maxSize) {
-     $fail("The {$attribute} may not be greater than {$this->maxSize} kilobytes.");
- }
+ // Check file size — dilewati jika limit upload dinonaktifkan via Pengaturan Aplikasi
+ if (\App\Services\FileUploadService::isLimitEnabled()) {
+     $sizeInKB = $value->getSize() / 1024;
+     if ($sizeInKB > $this->maxSize) {
+         $fail("The {$attribute} may not be greater than {$this->maxSize} kilobytes.");
+     }
+ }

4. app/Http/Controllers/FrontEnd/SistemKomplainController.php

Fitur — Rule max:1024 kondisional untuk lampiran 1–4:

+ $maxRule = \App\Services\FileUploadService::isLimitEnabled() ? '|max:1024' : '';
  $validator = Validator::make($request->all(), [
      ...
-     'lampiran1' => 'file|mimes:jpeg,png,jpg,gif,svg|max:1024|valid_file',
-     'lampiran2' => 'file|mimes:jpeg,png,jpg,gif,svg|max:1024|valid_file',
-     'lampiran3' => 'file|mimes:jpeg,png,jpg,gif,svg|max:1024|valid_file',
-     'lampiran4' => 'file|mimes:jpeg,png,jpg,gif,svg|max:1024|valid_file',
+     'lampiran1' => 'file|mimes:jpeg,png,jpg,gif,svg' . $maxRule . '|valid_file',
+     'lampiran2' => 'file|mimes:jpeg,png,jpg,gif,svg' . $maxRule . '|valid_file',
+     'lampiran3' => 'file|mimes:jpeg,png,jpg,gif,svg' . $maxRule . '|valid_file',
+     'lampiran4' => 'file|mimes:jpeg,png,jpg,gif,svg' . $maxRule . '|valid_file',
  ]);

5. app/Http/Controllers/Api/SuratController.php

Fitur — Rule max:2048 kondisional untuk file PDF surat:

- 'file' => 'required|file|mimes:pdf|max:2048',
+ 'file' => 'required|file|mimes:pdf' . (\App\Services\FileUploadService::isLimitEnabled() ? '|max:2048' : ''),

6. app/Http/Livewire/Widget/WidgetController.php

Fitur — Rule max:1024 kondisional untuk foto widget:

  public function rules() {
+     $maxRule = \App\Services\FileUploadService::isLimitEnabled() ? '|max:1024' : '';
      return [
          ...
-         'foto' => 'nullable|mimes:jpg,png,jpeg,gif|max:1024',
+         'foto' => 'nullable|mimes:jpg,png,jpeg,gif' . $maxRule,
      ];
  }

7. app/Http/Livewire/Informasi/MediaTerkaitController.php

Fitur — Rule max:1024 kondisional untuk logo media terkait:

  public function rules() {
+     $maxRule = \App\Services\FileUploadService::isLimitEnabled() ? '|max:1024' : '';
      return [
          ...
-         'logo' => $this->editMode ? 'nullable|mimes:jpg,png,jpeg|max:1024' : 'required|mimes:jpg,png,jpeg|max:1024',
+         'logo' => ($this->editMode ? 'nullable' : 'required') . '|mimes:jpg,png,jpeg' . $maxRule,
      ];
  }

8. app/Http/Livewire/Kerjasama/PendaftaranKerjasama.php

Fitur — Rule kondisional untuk file permohonan kerjasama:

Selain membuat rule kondisional, PR ini juga memperbaiki bug typo yang ada pada rule sebelumnya (required:mimes:pdfrequired|mimes:pdf):

  public function rules() {
+     $maxRule = \App\Services\FileUploadService::isLimitEnabled() ? '|max:1024' : '';
      return [
          ...
-         'permohonan' => 'required:mimes:pdf|max:1024',
+         'permohonan' => 'required|mimes:pdf' . $maxRule,
      ];
  }

9. app/Http/Requests/*.php (10 File)

Fitur — Skip rule max: pada Form Requests jika limit dinonaktifkan:

Menambahkan pengecekan kondisional isLimitEnabled() pada 10 file FormRequest yang memiliki validasi ukuran file secara hardcode (max:1024 atau max:2048). Jika toggle dimatikan, segmen rule max: tidak akan ditambahkan ke validation rules. File yang diperbarui meliputi:

  • DokumenRequest.php
  • MediaSosialRequest.php
  • PengurusRequest.php
  • PotensiRequest.php
  • ProfilRequest.php
  • ProsedurRequest.php
  • RegulasiRequest.php
  • SinergiProgramRequest.php
  • SlideRequest.php
  • UserRequest.php

Contoh implementasi:

- 'file_dokumen' => 'file|mimes:jpeg,png,jpg,gif,svg,xlsx,xls,doc,docx,pdf,ppt,pptx|max:2048|valid_file',
+ 'file_dokumen' => 'file|mimes:jpeg,png,jpg,gif,svg,xlsx,xls,doc,docx,pdf,ppt,pptx' . (\App\Services\FileUploadService::isLimitEnabled() ? '|max:2048' : '') . '|valid_file',

10. tests/Unit/FileUploadServiceTest.php

Test — Tambah 4 test case baru:

  • menolak file yang terlalu besar ketika limit aktif — memastikan validasi ukuran tetap berjalan ketika upload_limit = 1.
  • mengizinkan file besar ketika limit dinonaktifkan — memastikan file besar (5MB) diterima ketika upload_limit = 0.
  • isLimitEnabled mengembalikan true ketika setting aktif.
  • isLimitEnabled mengembalikan false ketika setting dinonaktifkan.
  • isLimitEnabled default aktif ketika setting belum ada — backward compatibility.

✅ Test Cases yang Diimplementasikan

  • Setting upload_limit tersimpan dengan benar di tabel das_setting setelah migration dijalankan.
  • Halaman Pengaturan → Aplikasi menampilkan baris "Upload Limit" dengan nilai Aktif.
  • Saat setting Tidak Aktif, file berukuran lebih dari 1MB berhasil diupload di form komplain.
  • Saat setting Aktif, file berukuran lebih dari 1MB di-reject dengan pesan validasi ukuran.
  • Saat setting Tidak Aktif, file berukuran lebih dari 1MB berhasil diupload di form widget, arsip pengurus, dan profil.
  • Upload import data (ZIP 50MB), backup database (100MB), dan tema tidak terpengaruh oleh toggle ini.
  • Unit test FileUploadServiceTest: 9 passed (14 assertions).

📸 Cara Menjalankan Uji Coba Manual

  1. Jalankan migration:
    php artisan migrate
  2. Buka Pengaturan → Aplikasi, cari baris "Upload Limit" — pastikan nilai awal adalah Aktif.
  3. Klik Edit → ubah nilai ke "Tidak Aktif" → simpan.
  4. Buka form Sistem Komplain → Kirim Keluhan, coba lampirkan file gambar berukuran lebih dari 1MB.
    • ✅ Seharusnya: upload berhasil tanpa pesan error ukuran.
  5. Ubah kembali setting ke "Aktif" dan coba upload file yang sama.
    • ✅ Seharusnya: muncul pesan validasi "The lampiran1 may not be greater than 1024 kilobytes".
  6. Verifikasi melalui Tinker:
    php artisan tinker --execute="echo App\Models\SettingAplikasi::where('key', 'upload_limit')->value('value');"
    # Output: 1 (Aktif) atau 0 (Tidak Aktif)
61cc5a27-69f5-4e80-ae1c-30f57f761e92.webm

⚠️ Catatan Penting

Meski toggle dinonaktifkan, ukuran file upload tetap dibatasi oleh konfigurasi server PHP (upload_max_filesize dan post_max_size di php.ini). Batasan ini berada di luar kendali aplikasi dan perlu disesuaikan secara terpisah di sisi server jika diperlukan.

@github-actions

Copy link
Copy Markdown

🔄 AI PR Review sedang antri di server...

Proses review akan segera dimulai di background — hasil akan muncul sebagai komentar setelah selesai.
Powered by CrewAI · PR #1610

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants