Lewati ke konten utama

Pengguna, Peran, dan Organisasi

Pendahuluan

Dokumen ini menjelaskan pendaftaran (onboarding) organisasi, manajemen pengguna, manajemen peran dan izin, serta perilaku profil organisasi.


File Utama

FileTanggung Jawab
pages/LoginPage.tsxTitik masuk Login
modules/onboarding/pages/OrganizationRegistrationPage.tsxPendaftaran organisasi publik
modules/onboarding/pages/AdminUserRegistrationPage.tsxPembuatan pengguna saat pendaftaran
modules/users/pages/UserListPage.tsxRute daftar pengguna organisasi, izin, dan orkestrasi dialog
modules/users/partials/UserListTable.tsxTabel pengguna dan tindakan baris
modules/users/dialogs/CreateUserDialog.tsxDialog buat pengguna
modules/users/dialogs/EditUserDialog.tsxDialog edit pengguna
modules/roles/pages/RoleListPage.tsxRute daftar peran, izin, dan orkestrasi dialog
modules/roles/partials/RoleListTable.tsxTabel peran dan tindakan baris
modules/roles/dialogs/CreateRoleDialog.tsxDialog buat peran dengan izin
modules/roles/dialogs/EditRoleDialog.tsxDialog edit peran dengan izin
modules/organizations/pages/OrganizationDetailPage.tsxHalaman detail organisasi saat ini
modules/organizations/dialogs/EditOrganizationDialog.tsxDialog edit organisasi
modules/organizations/pages/ProfilePage.tsxProfil pengguna saat ini
modules/organizations/dialogs/EditProfileDialog.tsxDialog edit profil pengguna saat ini
hooks/useApi.tsHook Pengguna, Peran, Organisasi, dan Izin
lib/api.tsGrup titik akhir user, role, permission, organization, dan location

Pendaftaran (Onboarding) Organisasi

  • /register
  • /user-form
  1. Muat Provinsi: OrganizationForm memuat provinsi dengan api.location.getProvinces().
  2. Muat Kota: Saat provinsi dipilih, sistem memuat kota dengan api.location.getCitiesByProvince(provinceId).
  3. Kirim (Submit): Formulir organisasi mengirimkan data ke api.organization.create(...).
  4. Respons Backend: Respons backend diharapkan mencakup organization dan adminRole.
  5. Navigasi: Aplikasi menavigasi ke /user-form dan meneruskan data organisasi/peran admin dalam state rute.
  6. Pembuatan Pengguna: UserForm membuat pengguna awal untuk organisasi tersebut.

Payload pembuatan organisasi memetakan nama field UI ke nama field backend:

Field UIField yang Dikirim
phone_numberphoneNumber
provinceprovince
citycity
oinkcodeoinkcode
parentIdnull

Manajemen Pengguna

  • Rute: /dashboard/user
  • Komponen: AllUser
  1. Inisialisasi Konteks: Membaca ID organisasi/pengguna saat ini dari cookie auth.
  2. Pemuatan Data: Memuat pengguna dengan useOrganizationUsers([deletionFlag, createFlag, editFlag]).
  3. Pemeriksaan Izin: Memuat izin melalui useUserPermissions().
  4. Visibilitas Tindakan: Menampilkan tindakan buat, edit, dan hapus sesuai izin.
  5. Validasi: Mencegah penghapusan pengguna saat ini di UI.
  6. Penanganan Formulir: Menggunakan CreateUser dan EditUser di dalam dialog.
  7. Manajemen State: Mengaktifkan flag lokal setelah buat/edit/hapus untuk memicu refetch hook.

Titik akhir API:

OperasiPanggilan API
Daftarapi.user.getAll()
Daftar terpaginasiapi.user.getPaginated(params)
Ambil satuapi.user.get(userId)
Buatapi.user.create(data)
Perbaruiapi.user.update(userId, data)
Hapusapi.user.delete(userId)

Manajemen Peran (Role)

  • Rute: /dashboard/role
  • Komponen: AllRole
  1. Pemuatan Data: Memuat peran dengan useRoles([deletionFlag, createFlag, editFlag]).
  2. Pemeriksaan Konteks: Mengambil pengguna saat ini melalui api.auth.me() untuk mengidentifikasi ID peran saat ini.
  3. Visibilitas Tindakan: Menampilkan tindakan buat, edit, dan hapus sesuai izin.
  4. Validasi: Mencegah penghapusan peran aktif pengguna saat ini di UI.
  5. Penanganan Formulir: Menggunakan CreateRole dan EditRole di dalam dialog.
  6. Metrik: Menampilkan jumlah izin pada daftar.

Formulir peran memuat katalog izin melalui api.permission.getAll() dan mengirimkan ID izin yang dipilih.

Titik akhir API:

OperasiPanggilan API
Daftarapi.role.getAll()
Daftar terpaginasiapi.role.getPaginated(params)
Ambil satuapi.role.get(roleId)
Buatapi.role.create(data)
Perbaruiapi.role.update(roleId, data)
Hapusapi.role.delete(roleId)
Izinapi.permission.getAll()

Detail Organisasi

  • Rute: /dashboard/organization
  • Komponen: OrganizationDetail
  1. Inisialisasi Konteks: Membaca ID pengguna saat ini dari cookie.
  2. Pemuatan Data: Memanggil useUser(userId, [editFlag]).
  3. Pemetaan Data: Membaca user.organization.
  4. Render Detail: Menampilkan nama organisasi, email, telepon, alamat, provinsi, dan kota.
  5. Visibilitas Tindakan: Menampilkan tindakan edit hanya jika pengguna memiliki izin edit-organization.
  6. Penanganan Formulir: Membuka EditOrganization dalam 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:

AreaBuatEditHapusBaca
Penggunacreate-useredit-userdelete-userread-user
Perancreate-roleedit-roledelete-roleread-role
Organisasin/aedit-organizationn/an/a

Backend tetap menjadi sumber kebenaran (source of truth) untuk otorisasi.


Mode Kegagalan

SkenarioPerilaku Frontend
Pemuatan provinsi/kota gagalPeringatan kesalahan ditampilkan dan formulir tetap dapat digunakan
Pembuatan organisasi mengembalikan data tidak validMelempar kesalahan dan menghentikan navigasi pendaftaran
Pemuatan daftar pengguna/peran gagalHook mencatat kesalahan dan mengekspos array fallback kosong
Penghapusan gagalPeringatan kesalahan ditampilkan
Pengambilan izin gagalTombol tindakan disembunyikan karena izin menjadi kosong
ID peran/pengguna saat ini hilangPencegahan penghapusan pengguna saat ini mungkin tidak berlaku