CI4 Admin Panel - CRUD Generator - Auth - Role Permission - Multi-language

Project ini adalah starter kit berbasis CodeIgniter 4 untuk membangun aplikasi web dengan fitur autentikasi, manajemen user, role, menu, bahasa, dan pengaturan website yang cukup lengkap.

Fitur Utama
- Auth lengkap: login, register, logout, lupa password, reset password, verifikasi email
- Social login: Google dan Facebook
- CAPTCHA untuk login, register, forgot password, dan reset password
- Dashboard control panel
- Account settings: update profil, ganti password, dan request perubahan email
- CRUD Generator untuk membuat modul secara cepat dari panel admin
  - Input `table_name` sekarang bisa pilih dari tabel existing via dropdown, lalu otomatis terisi ke field nama tabel
- Live Database untuk kelola tabel, data, query builder, preset query, dan history query langsung dari control panel
  - Column Builder dengan system field `id`, `created_at`, dan `updated_at` yang tampil tapi terkunci
  - Dynamic API per tabel di `/api/live/{table}` tanpa generate controller per tabel
  - API Docs per tabel dari aksi Live Database, termasuk contoh curl, JSON payload, upload file, filter tanggal, soft delete scope, restore, dan error response
  - API Token Management per tabel dengan permission `read`, `create`, `update`, dan `delete`
  - Bearer token bisa ditampilkan kembali dengan show/hide dari halaman token management
  - Response API menormalisasi tipe data: file menjadi array object, multi select/checkbox menjadi array, boolean menjadi true/false, number/currency menjadi angka
  - Response relasi menambahkan object label, misalnya `customer_id` tetap ada dan `customer` berisi `table`, `key`, dan `label`
  - Upload file lewat `multipart/form-data` atau JSON payload berbasis URL file
  - Soft delete API mendukung `scope=active`, `scope=deleted`, `scope=all`, restore row, dan cleanup file fisik saat hard delete
- Chat realtime untuk komunikasi user dari control panel
  - Halaman chat di `cp/chat`
  - Private chat dan group conversation
  - Search user dan search conversation
  - Realtime message via Socket.IO relay di folder `realtime-service`
  - Online presence, unread badge, read receipt, dan browser notification
  - Reply message, delete message, dan delete conversation dari daftar chat user
  - Upload attachment image, video, dan file
  - Link preview otomatis untuk URL di pesan
  - Cache conversation/message di browser dengan IndexedDB agar chat terasa lebih cepat
- Notification Center realtime
  - Dropdown notifikasi di navbar dengan unread badge
  - Browser notification dan sound notification
  - API notifikasi di `/api/notifications/*`
  - Mark as read dan mark all as read
  - Notification Templates untuk membuat template notifikasi berbasis `template_key`
  - Test notification ke user login atau beberapa user dari control panel
- Email Templates untuk mengelola template email auth/account dari control panel
  - CRUD template berdasarkan `template_key`
  - Preview template email
  - Integrasi `EmailTemplateRenderer` untuk kirim email langsung atau lewat queue
- Job Queue untuk memproses pekerjaan background
  - Driver database dan RabbitMQ
  - Worker CLI `php spark queue:work`
  - Monitor job dari control panel
  - Retry, run manual, cancel, delete, clear completed job, test job, dan generate handler job
- Manajemen user:
  - CRUD user dengan form create/edit berbasis modal
  - Soft delete, restore, dan force delete
  - Bulk action
  - Import Excel dan export Excel
  - Preview / impersonate user untuk melihat tampilan akun tertentu
  - Upload avatar user dan generate ukuran otomatis
  - Tracking last login dan metode login terakhir
  - Opsi keamanan ganda via email per user
  - Pilihan role menggunakan Select2
- Manajemen role
- Manajemen menu
- Mapping role-menu untuk kontrol akses
- Manajemen bahasa dan phrase/translation yang lebih lengkap
- Switch bahasa aktif
- Website settings:
  - General setting
  - System setting untuk session driver file, Redis local, dan Redis cloud
  - Cache setting untuk file, Redis, dan Memcached
  - Job Queue setting untuk database queue dan RabbitMQ
  - SEO metadata
  - Social auth setting
  - SMTP email setting
  - Authentication policy
  - Default role untuk user baru
  - CAPTCHA setting
  - Chat upload policy untuk ekstensi, ukuran maksimal, mode single/multiple, dan batas jumlah file per kategori
  - Query Builder blacklist tables
  - Upload asset seperti logo/favicon
  - Footer branding
  - Test email dari control panel
- Permission-based access control untuk area control panel
- Dukungan multi-language

Stack yang Dipakai
- Backend:
  - PHP 8.2
  - CodeIgniter 4.x
  - MySQLi
  - Node.js 20+ untuk realtime Socket.IO relay
- Package / Library:
  - kenjis/ci4-attribute-routes
  - predis/predis
  - php-amqplib/php-amqplib
  - phpoffice/phpspreadsheet
  - laminas/laminas-escaper
  - psr/log
  - express
  - socket.io
- Frontend:
- Bootstrap 5
- jQuery
- DataTables
- Select2
- Font Awesome
- Socket.IO client
- IndexedDB untuk cache chat di browser
- Dev tools:
  - PHPUnit
  - PHPStan
  - Rector

Demo
https://ci4-starterkit-demo.azdev.us.to
U : admin
P : admin123

Struktur Modul
- Auth
- Control Panel
- Users
- Roles
- Menus
- Role Menus
- Languages
- Website Settings
- Live Database
- Chat
- Notification Templates
- Email Templates
- Job Queue

Instalasi Singkat
1. Jalankan `composer install`
2. Copy dan sesuaikan file `.env`
3. Atur koneksi database pada `.env`
4. Jalankan migrasi dan seeder jika diperlukan
5. Jalankan project dengan `php spark serve`

Catatan
- URL dasar project di-detect otomatis dari `HTTP_HOST` dan protocol pada `app/Config/App.php`
- Aktifkan mode demo lewat `.env` dengan `app.demoMode = true` untuk membuat area control panel read-only
- Jika ingin mengembalikan data default, jalankan `php spark demo:reset`
- Project ini menggunakan pengaturan bahasa dan timezone dari website settings
- Project ini juga mendukung pengaturan session driver `file`, `redis_local`, atau `redis_cloud` dari website settings pada tab `System`
- Session Redis menggunakan library `predis/predis`, sehingga Redis local dan Redis Cloud bisa dipakai tanpa ekstensi PHP Redis
- Untuk Redis Cloud, isi host, port, username, password, database index, timeout, persistent connection, dan TLS sesuai endpoint provider
- Field Redis Database adalah index Redis seperti `0`, bukan nama database yang tampil di dashboard Redis Cloud
- Jika akses Redis Cloud terasa lambat, aktifkan persistent connection dan gunakan TLS hanya jika endpoint Redis memang membutuhkan TLS
- Cache aplikasi bisa memakai driver `file`, `redis`, atau `memcached` dari Website Settings > System > Cache
- Job Queue bisa memakai driver `database` atau `rabbitmq`; jalankan worker dengan `php spark queue:work`
- RabbitMQ memakai library `php-amqplib/php-amqplib` dan membutuhkan koneksi host, port, username, password, vhost, exchange, routing key, serta opsi SSL bila diperlukan
- Email auth default seperti verifikasi register, lupa password, 2FA, dan perubahan email bisa dicustom lewat menu Email Templates
- Chat API tersedia di `/api/chat/*` dan realtime relay Node.js tersedia di folder `realtime-service`
- Notification API tersedia di `/api/notifications/*` dan memakai realtime relay yang sama dengan chat
- Untuk realtime chat/notifikasi, set `CHAT_SOCKET_SECRET`, `CHAT_INTERNAL_SECRET`, `CHAT_SOCKET_URL`, dan `CHAT_SOCKET_PUBLIC_URL` di `.env`; nilai secret harus sama dengan `realtime-service/.env`
- Variabel `REALTIME_SERVICE_URL`, `REALTIME_SERVICE_PUBLIC_URL`, `REALTIME_SOCKET_SECRET`, dan `REALTIME_INTERNAL_SECRET` juga didukung sebagai alias konfigurasi realtime
- Pastikan folder `writable` punya permission yang sesuai