File Manager (Pengelola File)
| Code | SET-FIL |
| Module | Settings |
| Type | Master data (file) |
| Status | Implemented |
| Priority | P2 |
| Process | Administrasi tenant |
| API | [URL Postman] |
1. Overview
Pengelola File adalah pustaka semua file yang diunggah di tenant: logo perusahaan, gambar produk, lampiran, dan lainnya. Admin bisa melihat semua file dalam tampilan grid atau tabel, mencari dan menyaring file (kategori, ekstensi, status penggunaan, pengunggah), melihat pratinjau, serta menghapus file yang tidak dipakai.
File tidak diunggah dari halaman ini. Unggahan terjadi lewat komponen pengunggah di fitur lain (dari perangkat, pustaka, tautan, atau kamera). Pustaka yang sama dipakai saat memilih file yang sudah ada.
Hasil yang diharapkan: penyimpanan tenant tetap rapi, dan admin tahu file mana yang dipakai di mana sebelum menghapusnya.
2. Problem
- File yang diunggah menumpuk, termasuk file yang tidak pernah dipakai.
- Sulit mengetahui sebuah file dipakai di mana sebelum menghapusnya.
- Pengguna perlu memakai ulang file yang sama tanpa mengunggah ulang.
3. Goals & Non-goals
Goals
- Admin bisa menemukan file dengan cepat. Indikator: pencarian dan filter kategori, ekstensi, penggunaan, dan pengunggah.
- Admin tahu penggunaan file. Indikator: kolom “Digunakan Di” menampilkan koleksi yang memakai file.
- Admin bisa membersihkan file. Indikator: hapus satuan dan massal.
Non-goals
- Unggah file langsung dari halaman ini
- Folder, rename, atau pemindahan file
- Kuota penyimpanan dan statistik penggunaan
4. User Scenarios
| Role | Scenario |
|---|---|
| Admin | Menyaring file “Tidak Digunakan” lalu menghapusnya secara massal |
| Admin | Mencari logo lama berdasarkan nama file untuk melihat pratinjaunya |
| Owner | Melihat file apa saja yang diunggah oleh seorang pengguna |
| Admin | Beralih ke tampilan grid untuk menelusuri gambar produk secara visual |
5. User Flow
- Daftar file — Dimuat bertahap (infinite scroll, 10 per muatan). Pilihan tampilan grid/tabel diingat di browser (localStorage).
- Cari / filter — Pencarian nama file. Filter lanjutan: kategori (Gambar, Dokumen, Audio, Video), ekstensi (pilihan menyesuaikan kategori terpilih), penggunaan (Digunakan / Tidak Digunakan), dan dibuat oleh (pengguna).
- Pratinjau — Membuka file dalam penampil sesuai tipenya.
- Konfirmasi hapus — Dialog konfirmasi untuk hapus satuan atau massal.
- Terhapus — Toast sukses, daftar dimuat ulang.
Alternative paths
- Kategori filter diubah — ekstensi terpilih yang tidak termasuk kategori baru otomatis dilepas.
- File dipakai lalu dihapus — tidak dicegah FE (lihat EC-01).
6. User Stories
Prioritas: P0 wajib untuk rilis, P1 penting, P2 kalau sempat.
US-01 — Menelusuri file (P2)
Sebagai admin, saya ingin melihat semua file tenant, agar tahu apa saja yang tersimpan.
| ID | Kriteria penerimaan |
|---|---|
| AC-01.1 | Tampilan tabel: nama berkas, kategori, ukuran, diunggah pada, digunakan di, dibuat oleh. |
| AC-01.2 | Tampilan grid: gambar mini untuk file gambar, nama berkas, dan tipe MIME. |
| AC-01.3 | Pilihan tampilan grid/tabel tersimpan di browser dan dipakai lagi saat halaman dibuka. |
| AC-01.4 | Data dimuat bertahap saat menggulir. |
| AC-01.5 | Kolom “Digunakan Di” menampilkan nama koleksi; bila lebih dari satu, tampil jumlah koleksi yang bisa diperluas. |
US-02 — Mencari dan menyaring file (P2)
Sebagai admin, saya ingin menyaring file, agar cepat menemukan file tertentu.
| ID | Kriteria penerimaan |
|---|---|
| AC-02.1 | Pencarian berdasarkan kata kunci. |
| AC-02.2 | Filter kategori (multi), ekstensi (multi, sesuai kategori), penggunaan (Digunakan / Tidak Digunakan / semua), dan dibuat oleh (multi pengguna). |
| AC-02.3 | Jumlah filter aktif tampil di tombol filter. |
US-03 — Pratinjau file (P2)
Sebagai admin, saya ingin melihat isi file tanpa mengunduhnya.
| ID | Kriteria penerimaan |
|---|---|
| AC-03.1 | Aksi Lihat membuka pratinjau file dari tampilan grid maupun tabel. |
US-04 — Menghapus file (P2)
Sebagai admin, saya ingin menghapus file yang tidak dipakai, agar penyimpanan rapi.
| ID | Kriteria penerimaan |
|---|---|
| AC-04.1 | Hapus satuan dan massal hanya tersedia untuk pengguna dengan izin delete, setelah konfirmasi. |
| AC-04.2 | Bila BE menolak, pesan error tampil sebagai toast. |
7. Document Structure
| Field | Required | Default | Notes |
|---|---|---|---|
Nama Berkas (filename) | — | — | Read-only |
| Kategori | — | — | image, document, audio, video |
| Ekstensi | — | — | Misalnya png, pdf |
| Tipe MIME | — | — | |
| Ukuran | — | — | Byte, ditampilkan terformat |
Diunggah Pada (updated_at) | — | — | Tanggal dan jam |
Dibuat Oleh (creator) | — | — | Pengguna pengunggah |
| URL | — | — | Untuk pratinjau |
Digunakan Di (fileables[].collection) | — | — | Koleksi yang memakai file |
Aturan unggah (komponen pengunggah di fitur lain): maksimal 1 MB per file (default); tipe diterima per fitur (gambar, dokumen PDF/Word/Excel/PowerPoint, audio, video); sumber upload, library, link, webcam; alur presign → unggah → finalize.
8. Status Lifecycle
Tidak berlaku. File tidak punya status; status “Digunakan / Tidak Digunakan” diturunkan dari ada atau tidaknya relasi fileables.
9. Permissions & Actions
Permissions
| Action | Permission | Syarat tambahan |
|---|---|---|
| Lihat, cari, filter, pratinjau file | settings:file:list:any | — |
| Hapus file | settings:file:delete:any | — |
FE menyembunyikan aksi yang tidak diizinkan; BE tetap menolaknya.
10. Business Rules
Aturan bisnis adalah ketentuan yang berlaku di semua layar dan semua aksi, siapa pun yang melakukannya. FE memakainya sebagai validasi di form, BE memakainya sebagai sumber kebenaran; jika keduanya berbeda, perilaku BE yang dianggap benar dan FE menyesuaikan.
- BR-01 File hanya bisa ditambahkan lewat komponen pengunggah di fitur lain, bukan dari Pengelola File.
- BR-02 Kategori file ditentukan dari tipe MIME: gambar, dokumen, audio, video.
- BR-03 Ukuran unggahan default maksimal 1 MB per file.
- BR-04 Filter penggunaan dikirim sebagai
has_any_relationships(true = digunakan, false = tidak digunakan). - BR-05 Filter ekstensi hanya boleh berisi ekstensi dari kategori yang dipilih.
11. Edge Cases
Edge case adalah kondisi yang jarang terjadi tetapi pasti muncul di operasional nyata. Perilaku yang diharapkan ditetapkan di sini agar tidak diputuskan sendiri-sendiri saat implementasi.
| ID | Case | Expected behavior |
|---|---|---|
| EC-01 | Menghapus file yang masih digunakan (misalnya logo perusahaan) | FE tidak memperingatkan; BE menentukan apakah ditolak atau relasi ikut dilepas |
| EC-02 | Hapus massal dengan sebagian file gagal dihapus | Ditentukan BE; pesan dari BE tampil sebagai toast |
| EC-03 | Unggahan melebihi 1 MB | Ditolak pengunggah sebelum dikirim |
12. API Contract
| Action | Method | Endpoint | Ref |
|---|---|---|---|
| Daftar file (cursor, cari, filter) | GET | /api/files/cursor | US-01, US-02 |
| Hapus file | DELETE | /api/files/:id | US-04 |
| Hapus file massal | DELETE | /api/files/bulk | US-04 |
| Presign unggah (dipakai pengunggah) | POST | /api/files/upload/presign | BR-01 |
| Finalisasi unggah (dipakai pengunggah) | GET | /api/files/upload/finalize/:id | BR-01 |
| Pilihan filter “Dibuat Oleh” | GET | /api/users/cursor | AC-02.2 |
13. Dependencies
PRD terkait
- Company — logo perusahaan disimpan sebagai file.
- Users — pengunggah file dan avatar pengguna.
- Modul lain yang memakai pengunggah (produk, dan lainnya).
Efek ke modul lain
- Menghapus file yang digunakan bisa membuat gambar/lampiran di modul lain hilang (lihat EC-01).