Pengguna, Peran, dan Organisasi
Pendahuluan
Dokumen ini menjelaskan pendaftaran (onboarding) organisasi, manajemen pengguna, manajemen peran dan izin, serta perilaku profil organisasi.
File Utama
| File | Tanggung Jawab |
|---|---|
pages/LoginPage.tsx | Titik masuk Login |
modules/onboarding/pages/OrganizationRegistrationPage.tsx | Pendaftaran organisasi publik |
modules/onboarding/pages/AdminUserRegistrationPage.tsx | Pembuatan pengguna saat pendaftaran |
modules/users/pages/UserListPage.tsx | Rute daftar pengguna organisasi, izin, dan orkestrasi dialog |
modules/users/partials/UserListTable.tsx | Tabel pengguna dan tindakan baris |
modules/users/dialogs/CreateUserDialog.tsx | Dialog buat pengguna |
modules/users/dialogs/EditUserDialog.tsx | Dialog edit pengguna |
modules/roles/pages/RoleListPage.tsx | Rute daftar peran, izin, dan orkestrasi dialog |
modules/roles/partials/RoleListTable.tsx | Tabel peran dan tindakan baris |
modules/roles/dialogs/CreateRoleDialog.tsx | Dialog buat peran dengan izin |
modules/roles/dialogs/EditRoleDialog.tsx | Dialog edit peran dengan izin |
modules/organizations/pages/OrganizationDetailPage.tsx | Halaman detail organisasi saat ini |
modules/organizations/dialogs/EditOrganizationDialog.tsx | Dialog edit organisasi |
modules/organizations/pages/ProfilePage.tsx | Profil pengguna saat ini |
modules/organizations/dialogs/EditProfileDialog.tsx | Dialog edit profil pengguna saat ini |
hooks/useApi.ts | Hook Pengguna, Peran, Organisasi, dan Izin |
lib/api.ts | Grup titik akhir user, role, permission, organization, dan location |
Pendaftaran (Onboarding) Organisasi
/register/user-form
- Muat Provinsi:
OrganizationFormmemuat provinsi denganapi.location.getProvinces(). - Muat Kota: Saat provinsi dipilih, sistem memuat kota dengan
api.location.getCitiesByProvince(provinceId). - Kirim (Submit): Formulir organisasi mengirimkan data ke
api.organization.create(...). - Respons Backend: Respons backend diharapkan mencakup
organizationdanadminRole. - Navigasi: Aplikasi menavigasi ke
/user-formdan meneruskan data organisasi/peran admin dalam state rute. - Pembuatan Pengguna:
UserFormmembuat pengguna awal untuk organisasi tersebut.
Payload pembuatan organisasi memetakan nama field UI ke nama field backend:
| Field UI | Field yang Dikirim |
|---|---|
phone_number | phoneNumber |
province | province |
city | city |
oinkcode | oinkcode |
parentId | null |
Manajemen Pengguna
- Rute:
/dashboard/user - Komponen:
AllUser
- Inisialisasi Konteks: Membaca ID organisasi/pengguna saat ini dari cookie auth.
- Pemuatan Data: Memuat pengguna dengan
useOrganizationUsers([deletionFlag, createFlag, editFlag]). - Pemeriksaan Izin: Memuat izin melalui
useUserPermissions(). - Visibilitas Tindakan: Menampilkan tindakan buat, edit, dan hapus sesuai izin.
- Validasi: Mencegah penghapusan pengguna saat ini di UI.
- Penanganan Formulir: Menggunakan
CreateUserdanEditUserdi dalam dialog. - Manajemen State: Mengaktifkan flag lokal setelah buat/edit/hapus untuk memicu refetch hook.
Titik akhir API:
| Operasi | Panggilan API |
|---|---|
| Daftar | api.user.getAll() |
| Daftar terpaginasi | api.user.getPaginated(params) |
| Ambil satu | api.user.get(userId) |
| Buat | api.user.create(data) |
| Perbarui | api.user.update(userId, data) |
| Hapus | api.user.delete(userId) |
Manajemen Peran (Role)
- Rute:
/dashboard/role - Komponen:
AllRole
- Pemuatan Data: Memuat peran dengan
useRoles([deletionFlag, createFlag, editFlag]). - Pemeriksaan Konteks: Mengambil pengguna saat ini melalui
api.auth.me()untuk mengidentifikasi ID peran saat ini. - Visibilitas Tindakan: Menampilkan tindakan buat, edit, dan hapus sesuai izin.
- Validasi: Mencegah penghapusan peran aktif pengguna saat ini di UI.
- Penanganan Formulir: Menggunakan
CreateRoledanEditRoledi dalam dialog. - Metrik: Menampilkan jumlah izin pada daftar.
Formulir peran memuat katalog izin melalui api.permission.getAll() dan mengirimkan ID izin yang dipilih.
Titik akhir API:
| Operasi | Panggilan API |
|---|---|
| Daftar | api.role.getAll() |
| Daftar terpaginasi | api.role.getPaginated(params) |
| Ambil satu | api.role.get(roleId) |
| Buat | api.role.create(data) |
| Perbarui | api.role.update(roleId, data) |
| Hapus | api.role.delete(roleId) |
| Izin | api.permission.getAll() |
Detail Organisasi
- Rute:
/dashboard/organization - Komponen:
OrganizationDetail
- Inisialisasi Konteks: Membaca ID pengguna saat ini dari cookie.
- Pemuatan Data: Memanggil
useUser(userId, [editFlag]). - Pemetaan Data: Membaca
user.organization. - Render Detail: Menampilkan nama organisasi, email, telepon, alamat, provinsi, dan kota.
- Visibilitas Tindakan: Menampilkan tindakan edit hanya jika pengguna memiliki izin
edit-organization. - Penanganan Formulir: Membuka
EditOrganizationdalam dialog dan melakukan refetch setelah ditutup.
Profil
- Rute:
/dashboard/profile
Layar profil menampilkan dan mengedit profil pengguna saat ini. Layar ini mengikuti pola yang sama dengan detail organisasi: mengambil data pengguna saat ini, merender detail baca-saja, membuka dialog edit, lalu melakukan refetch setelah pengeditan berhasil.
Izin
Layar manajemen menggunakan slug berikut:
| Area | Buat | Edit | Hapus | Baca |
|---|---|---|---|---|
| Pengguna | create-user | edit-user | delete-user | read-user |
| Peran | create-role | edit-role | delete-role | read-role |
| Organisasi | n/a | edit-organization | n/a | n/a |
Backend tetap menjadi sumber kebenaran (source of truth) untuk otorisasi.
Mode Kegagalan
| Skenario | Perilaku Frontend |
|---|---|
| Pemuatan provinsi/kota gagal | Peringatan kesalahan ditampilkan dan formulir tetap dapat digunakan |
| Pembuatan organisasi mengembalikan data tidak valid | Melempar kesalahan dan menghentikan navigasi pendaftaran |
| Pemuatan daftar pengguna/peran gagal | Hook mencatat kesalahan dan mengekspos array fallback kosong |
| Penghapusan gagal | Peringatan kesalahan ditampilkan |
| Pengambilan izin gagal | Tombol tindakan disembunyikan karena izin menjadi kosong |
| ID peran/pengguna saat ini hilang | Pencegahan penghapusan pengguna saat ini mungkin tidak berlaku |