Skip to content

Fix foto pengurus tidak tersimpan saat tambah data baru - #1773

Open
pandigresik wants to merge 1 commit into
rilis-devfrom
fix/simpan_foto_pengguna
Open

pandigresik wants to merge 1 commit into
rilis-devfrom
fix/simpan_foto_pengguna

Conversation

@pandigresik

Copy link
Copy Markdown
Contributor

Description

Saat menambah data pengurus baru, file foto sudah dipilih dan form tersimpan sukses, tetapi kolom foto di database tetap NULL — foto baru tersimpan setelah data diedit dan foto diinput ulang (issue #1770).

Penyebabnya: pada PengurusController::store(), file sudah di-upload oleh handleFileUpload() ke storage/app/public/pengurus/, namun nama file di $input['foto'] tidak pernah ditulis ke database karena 'foto' tidak tercantum dalam daftar $fillableFields yang di-loop. Metode update() tidak terdampak karena memakai $pengurus->update($input) secara langsung — itulah sebabnya bug hanya muncul di proses tambah.

Solusi pada PR ini: menambahkan 'foto' ke $fillableFields pada store(), sehingga nama file hasil upload ikut tersimpan ke kolom das_pengurus.foto pada saat pertama kali data dibuat. Ditambah regression test yang memastikan kolom foto terisi dan file benar-benar ada di disk.

Changes made:

  1. Controller fix: app/Http/Controllers/Data/PengurusController.php — 'foto' ditambahkan ke array $fillableFields di store() sehingga nilai hasil handleFileUpload() tersimpan ke database saat create.
  2. Code style: PengurusController.php — pembersihan kecil hasil vendor/bin/pint pada file yang sama (hapus else tidak berguna di render status DataTables, hapus @return mixed pada phpdoc index(), hapus whitespace di akhir baris destroy()). Tidak mengubah perilaku.
  3. Test: tests/Feature/Controllers/Data/PengurusControllerTest.php — test store creates pengurus with file upload diperkuat dengan Storage::fake('local') (agar upload tidak menulis file asli) dan assertion getRawOriginal('foto') tidak NULL + file ada di public/pengurus/{nama}.

Reason for change:

  • Point 1: $input['foto'] berisi nama file hasil upload, tetapi loop $fillableFields tidak pernah menyalinnya ke model — kolom foto tidak pernah terisi pada proses create.
  • Point 2: Perbaikan sebaris membuat perilaku store() konsisten dengan update() yang sudah benar, tanpa mengubah alur validasi (PengurusRequest) maupun penyimpanan file (HandlesFileUpload).
  • Point 3: Test yang diperkuat mencegah regresi serupa (test sebelumnya hanya memastikan record dibuat, tidak memastikan foto tersimpan).

Impact of change:

✅ Foto pengurus tersimpan pada saat pertama kali tambah data — sesuai harapan pada issue #1770.
✅ Tidak ada lagi keharusan edit-ulang hanya untuk memasukkan foto (menghemat langkah pengguna & mengurangi data tanpa foto).
✅ Tidak ada file yatim — sebelumnya file sudah terupload ke storage namun tidak direferensikan database.
✅ Regression test terpasang — memverifikasi kolom foto terisi dan file fisik benar-benar ada.

Related Issue

Steps to Reproduce

Before fix (problem):

  1. Login ke OpenDK, buka menu Data → Pengurus.
  2. Klik Tambah (form tambah pengurus baru).
  3. Isi data wajib, lalu unggah foto (jpg/jpeg/png) — preview foto muncul.
  4. Klik Simpan → muncul pesan "Pengurus berhasil ditambah!".
  5. ❌ Foto tidak tampil pada daftar pengurus; kolom das_pengurus.foto tetap NULL (file sudah ada di storage, tetapi tidak direferensikan).
  6. Buka Ubah → unggah ulang foto → Simpan → baru foto tampil.

After fix (solution):

  1. Login ke OpenDK, buka menu Data → Pengurus.
  2. Klik Tambah, isi data wajib, unggah foto.
  3. Klik Simpan.
  4. ✅ Foto langsung tersimpan dan tampil pada daftar pengurus tanpa perlu edit ulang.

Testing on related features:

  • Tambah pengurus tanpa foto (nullable) — ✅ tetap berfungsi
  • Ubah pengurus (ganti foto, ganti data) — ✅ tetap berfungsi
  • Hapus pengurus (file foto ikut dihapus via HandlesResourceDeletion) — ✅ tidak terpengaruh
  • Bagan struktur & daftar pengurus (DataTables) — ✅ tidak terpengaruh

Checklist

  • Saya telah mematuhi aturan penulisan script
  • Saya telah mengikuti proses review pull request
  • Saya telah membuat unit/integration test untuk memverifikasi perbaikan
  • Pengujian manual telah dilakukan di environment development
  • Tidak ada console errors atau warnings
  • Kode telah direview oleh [minimal 1 orang]

Technical Details

Technical Explanation

Alur store() sebelum dan sesudah perbaikan:

$input = $request->validated();
$this->handleFileUpload($request, $input, 'foto', 'pengurus', false);
// -> file tersimpan di storage/app/public/pengurus/<hash>.jpg
// -> $input['foto'] = '<hash>.jpg'   (withDirectory = false)

$pengurus = new Pengurus;
$fillableFields = [..., 'bagan_warna', 'foto']; // 'foto' DITAMBAHKAN

foreach ($fillableFields as $field) {
    if (isset($input[$field])) {
        $pengurus->$field = $input[$field];
    }
}

$pengurus->save();

Karena isset($input['foto']) bernilai false saat tidak ada file (atau true saat ada), penambahan 'foto' ke daftar aman untuk kasus tanpa foto — kolom tetap NULL sesuai aturan nullable.

Mengapa sebelumnya file tetap ter-upload tetapi "tidak tersimpan": HandlesFileUpload::handleFileUpload() hanya menulis ke storage dan mengisi $input; penulisan ke database sepenuhnya bergantung pada daftar $fillableFields di store() yang tidak memuat foto. Metode update() memakai $pengurus->update($input) (mass-assign langsung dari validated + hasil upload), sehingga tidak terdampak.

Catatan pembacaan nilai: Pengurus::getFotoAttribute() mengembalikan Storage::url('pengurus/'.$value) sehingga ->value('foto') pada query Eloquent akan memakai accessor. Test memakai getRawOriginal('foto') untuk memverifikasi nilai mentah kolom.

Configuration changes

Tidak ada perubahan konfigurasi.

Dependencies added

Tidak ada dependensi baru.

Testing

Manual Testing

  • Tambah pengurus baru dengan foto → simpan → foto langsung tampil di daftar
  • Tambah pengurus baru tanpa foto → simpan → berhasil, kolom foto kosong
  • Ubah pengurus → ganti foto → simpan → foto baru tampil, foto lama terhapus dari storage
  • Validasi foto: format selain jpg/jpeg/png, ukuran > 1 MB (bila upload_limit aktif) → error validasi tampil
  • Regression testing — daftar pengurus, hapus pengurus, bagan struktur tidak rusak

Automated Testing

  • Feature Test — tests/Feature/Controllers/Data/PengurusControllerTest.php → store creates pengurus with file upload (17 test / 68 assertions lolos)
  • Regression — jalankan penuh php vendor/bin/pest

Screenshots / Video

simplescreenrecorder-2026-10-08_16.27.36.mp4

Before:

Foto sudah dipilih pada form tambah, tetapi setelah simpan foto tidak tampil (kolom foto NULL).

After:

Foto langsung tersimpan dan tampil pada daftar pengurus setelah form tambah disimpan.

Breaking Changes

None.

Migration Guide

Not required — tidak ada perubahan skema maupun konfigurasi.

References


Additional notes: Branch fix/simpan_foto_pengguna menuju rilis-dev. 2 file diubah (+12/−6), commit 95e1fdfe. Perubahan inti hanya penambahan satu item 'foto' pada $fillableFields; sisanya formatting Pint dan penguatan test.

@github-actions

github-actions Bot commented Oct 8, 2026

Copy link
Copy Markdown
Contributor

🔄 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 #1773

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.

1 participant