10 KiB
Laporan persiapan migrasi CI3 → CI4
Sumber (tidak diubah): C:\laragon\www\bij-migration\bij.mwp.co.id
Target: C:\laragon\www\bij-migration\bij.mwp.co.id-ci4 (CodeIgniter 4.7.x via appstarter)
Indeks dokumen terbaru: mulai dari README.md (controllers, models, routes, auth, risks, json_api_map, ROADMAP).
API mobile sudah di-port ke App\Services\Mobile\MobileJsonService + MobileJsonController; admin memakai layout dasar + aset TailAdmin di public/assets/tailadmin/.
Dokumen ini tetap memuat ringkasan awal + checklist; detail teknis dipindah ke file tema di folder yang sama.
1. Peta komponen CI3
1.1 Controller (application/controllers/)
| File | Peran singkat |
|---|---|
Json.php |
API JSON untuk aplikasi mobile (presensi, cuti, profil, dll.); query DB langsung di controller |
Site.php |
Frontend ringkas: redirect, halaman login, login_auth (Ion Auth) |
Cli.php |
Perintah CLI |
Errors.php |
Penanganan error |
Routing default: application/config/routes.php mengarah ke site; endpoint Json mengikuti konvensi CI3 controller/method (mis. json/login).
1.2 Model (application/models/)
| Model | Konteks tipikal |
|---|---|
User_model.php, Group_model.php, Admin_user_model.php, Api_key_model.php |
Pola CI Bootstrap / admin & API (bukan dipakai langsung oleh Json.php mobile) |
Catatan: logika mobile di Json.php tidak memakai model ini; data diambil lewat $this->db di controller.
1.3 Routes (application/config/routes.php)
default_controller=site- Pola CI Bootstrap 3: prefix bahasa
^(\w{2})/(.*)$, routing RESTapi/(:any)/(:num)→ modulapi - Tidak ada definisi eksplisit per method untuk
Json; mengandalkan routing default CI3.
1.4 Modul HMVC (application/modules/)
| Modul | Isi penting |
|---|---|
| admin | Home, Pegawai, Presensi, Perusahaan, Laporan, Panel, Util, Errors; views + Grocery CRUD / laporan |
| api | Home, Swagger, Errors; library Jwt_client.php (Firebase JWT)—alur mobile Json.php memakai token string di tabel pegawai, bukan JWT ini |
| adminlte | Widget.php—komponen UI |
HMVC memakai MX_Controller (lihat application/core/MY_Controller.php).
1.5 Auth
- Web admin / site: Ion Auth (
ion_authdi autoload), login diSite::login_auth, pembatasan halaman lewatmPageAuth+ion_auth->in_group()diMY_Controller. - Mobile (
Json.php): autentikasi stateless token disimpan kolompegawai.token, password MD5 di tabel; tidak memakai Ion Auth di controller ini.
1.6 Helper & library custom (ringkas)
Helpers (application/helpers/): MY_string_helper.php, MY_url_helper.php, MY_directory_helper.php.
Libraries (akar application/libraries/, selain vendor besar):
Data_importer.php,Form_builder.php,System_message.phpMY_Email.php,MY_Form_validation.php,MY_Pagination.phpPHPExcel.php+ pohon PHPExcel (usang; di CI4 ganti PhpSpreadsheet)
Autoload (application/config/autoload.php): paket ion_auth, grocery_crud, image_crud, rest_server; library database, ion_auth, form_validation.
Third party (indikasi): Ion Auth, Grocery CRUD, Image CRUD, REST server (lihat folder application/third_party/ bila perlu detail).
2. Audit application/controllers/Json.php
2.1 Daftar method publik
| Method | Kategori |
|---|---|
index |
Penolakan akses |
login_w_token |
Login / token |
login |
Login / token |
profil |
Pegawai / mobile |
save_cuti |
Cuti + upload / mobile |
batalkan_cuti |
Cuti / mobile |
save_aktifitas |
Aktivitas + upload / mobile |
save_masuk |
Presensi + geo + foto / mobile |
save_pulang |
Presensi + geo + foto / mobile |
save_istirahat |
Presensi / mobile |
presensi_today |
Presensi / mobile |
presensi |
Presensi / mobile |
daftar_today |
Presensi / daftar rekan / mobile |
berita |
Konten / mobile |
cuti |
Cuti / mobile |
lembur |
Lembur / mobile |
libur |
Master libur / mobile |
aktifitas |
Aktivitas / mobile |
save_pp |
Profil foto / mobile |
save_password |
Auth password / mobile |
Private: generateRandomString, utf8ize.
2.2 Login, token, pegawai, endpoint mobile
- Login / token:
login,login_w_token(semua method lain memakaitokenPOST untuk identitas pegawai). - Pegawai:
profil,save_pp,save_password; seluruh alur memuat barispegawailewat token. - Endpoint mobile (khas app): semua di atas kecuali
index; pola respons JSON + headerAccess-Control-Allow-Origin: *(CORS permisif).
2.3 Query langsung ke database
Seluruh file memakai Active Record / query builder CI3 ($this->db->...) di dalam controller—tidak lewat model. Setiap method melakukan satu atau lebih: from, where, get, insert, update, join, dll. Tabel yang muncul: antara lain pegawai, kantor, jabatan, unit_kerja, lembur, dilapangan, libur, cuti, jadwal, presensi, berita, cuti_dokumen, aktifitas_harian.
2.4 Refactor besar yang disarankan
- Keamanan: password MD5; token prediktabil (bagian
md5(id_pegawai)+ random); token disimpan plain di DB; tanpa rate limiting di controller. - Arsitektur: pindahkan query ke Model / Repository / Service; controller hanya HTTP + validasi.
- Upload: base64 → file via helper
file; path relatif./assets/uploads/...—di CI4 gunakanWritable/filesystem config, validasi MIME/size, nama file aman. utf8izememakaiutf8_encode()— perilaku usang/deprecated di PHP modern; sebaiknya konsisten UTF-8 dari DB danjson_encodedengan flag yang tepat.daftar_today: tanggal di-inline ke string join (date("Y-m-d"))—risiko konsistensi; sebaiknya binding parameter / query builder terpisah.save_pulang: variabel toleransi memakai fieldtoleransi_terlambatuntuk batas pulang—perlu verifikasi apakah itu maksud bisnis atau bug (copy-paste dari masuk).- CORS
*+ POST form-style: tinjau ulang untuk produksi (origin spesifik, HTTPS, CSRF untuk web—mobile biasanya token header).
Detail baris-per-baris ada di file pendamping audit-json-controller.md (folder yang sama).
3. Komponen: pindah langsung vs tulis ulang vs ditinggalkan
3.1 Bisa dipindahkan / diadaptasi dengan effort kecil–sedang
- Pola respons JSON
{ status, pesan, ... }— pertahankan sementara untuk kompatibilitas klien mobile. - Struktur query bisnis (jadwal harian, insert
presensiharian) — logika bisa dipindah ke service dengan sedikit penyesuaian API CI4 DB. - Helper custom yang murni string/url — port bertahap ke helper CI4 atau class util.
3.2 Harus ditulis ulang (disarankan)
- Autentikasi mobile: ganti MD5 →
password_hash/ verifikasi modern; token → JWT atau session server + refresh; invalidasi token. - Seluruh lapisan akses data untuk API mobile — model CI4, validasi input, transaction di operasi multi-tabel.
- Ion Auth + HMVC admin — di CI4 umumnya modul terpisah atau admin berdiri sendiri; tidak ada port 1:1 HMVC MX.
- PHPExcel — ganti PhpSpreadsheet.
- Grocery CRud / Image Crud — evaluasi CI4 admin scaffold atau CRUD custom / paket modern.
3.3 Sebaiknya ditinggalkan atau diganti
- PHPExcel sebagai dependensi jangka panjang.
- CORS
*di API sensitif data kepegawaian. - Duplikasi besar potongan “decode base64 + write_file + insert DB” di banyak method — ganti satu UploadService + policy keamanan.
4. Struktur di target CI4 (aman, tanpa ubah vendor framework)
app/Controllers/Api/MobileJsonController.php— endpoint API mobile.app/Services/Mobile/MobileJsonService.php— port logika dariJson.php.app/Libraries/LegacyUtf8Encoder.php— setarautf8izeuntuk string ISO-8859-1.app/Config/Routes.php— grupapi/mobile/*dan aliasjson/*.app/Controllers/Admin/Dashboard.php+app/Views/layouts/*,app/Views/pages/dashboard.php— foundation admin + TailAdmin assets dipublic/assets/tailadmin/.public/assets/uploads/*— folder upload (dengan.gitkeep).
5. Checklist migrasi bertahap
Gunakan urutan ini; centang setelah tiap fase stabil di staging.
Fase A — Lingkungan & data
- Samakan versi PHP target dengan CI4; backup DB produksi.
- Dokumentasikan skema tabel yang dipakai
Json.php(ER ringkas atau export struktur saja). .envCI4: koneksi DB terpisah / read-only untuk eksperimen awal (opsional).
Fase B — API mobile (prioritas kompatibilitas klien)
- Implementasi
login+login_w_token(+ endpoint lain) di CI4 — kode siap; verifikasi di staging wajib. - Pindahkan validasi pegawai-by-token ke filter / service tunggal (
MobileAuthService). profil— ekstrak query ke model; tes parity JSON dengan CI3.
Fase C — Presensi & file
presensi_today+ insert baris harian — transaction + tes race condition.save_masuk/save_pulang/save_istirahat— satu domain PresensiService; perbaiki logika toleransi jika sudah diverifikasi user bisnis.- Unified handler upload (cuti / aktivitas / absen / profil) + storage path CI4 (folder
public/assets/uploadssudah disiapkan).
Fase D — Fitur sekunder mobile
- Cuti:
cuti,save_cuti,batalkan_cuti+ relasi dokumen. berita,lembur,libur,aktifitas,daftar_today.save_password— bcrypt + policy password.
Fase E — Admin & HMVC
- Inventarisasi modul
adminper controller; rencanakan modul CI4 (Shield, custom admin, atau SPA terpisah). - Ganti PHPExcel di laporan; uji cetak/ekspor.
- Matikan rute CI3 untuk endpoint yang sudah dialihkan; proxy bertahap atau cutover DNS.
Fase F — hardening
- CORS ketat, HTTPS, rate limit login, audit log presensi.
- Hapus dependensi yang tidak terpakai; tes beban ringan pada endpoint paling sering dipanggil.
Dibuat sebagai artefak persiapan migrasi; sumber CI3 tidak dimodifikasi.