Files
D1041231091-WebGIS-All/05/tambah_user.php
T

64 lines
2.1 KiB
PHP

<?php
/**
* tambah_user.php
* Membuat akun pengguna dari dashboard.
* - Super admin dapat membuat akun admin_rumah_ibadah dan penerima.
* - Admin rumah ibadah hanya dapat membuat akun penerima.
* Password disimpan memakai password_hash().
*/
require_once __DIR__ . '/auth.php';
require_login(true);
require_role(['super_admin', 'admin_rumah_ibadah'], true);
require_post();
$actor = current_user();
$actorRole = $actor['role'];
$nama = clean_text(post('nama'), 100);
$username = clean_text(post('username'), 50);
$password = post('password');
$role = post('role');
$status_akun = post('status_akun', 'aktif');
$statusList = ['aktif', 'nonaktif'];
$allowedRoles = ($actorRole === 'super_admin') ? ['admin_rumah_ibadah', 'penerima'] : ['penerima'];
if ($nama === '' || $username === '' || $password === '') {
json_response('err', 'Nama, username, dan password wajib diisi.', [], 422);
}
if (!preg_match('/^[a-zA-Z0-9_\.\-]{4,50}$/', $username)) {
json_response('err', 'Username minimal 4 karakter dan hanya boleh huruf, angka, titik, strip, atau underscore.', [], 422);
}
if (strlen($password) < 6) {
json_response('err', 'Password minimal 6 karakter.', [], 422);
}
if (!valid_enum($role, $allowedRoles)) {
json_response('err', 'Role tidak boleh dibuat oleh akun ini.', [], 403);
}
if (!valid_enum($status_akun, $statusList)) {
json_response('err', 'Status akun tidak valid.', [], 422);
}
$stmt = $koneksi->prepare("SELECT id FROM users WHERE username=? LIMIT 1");
$stmt->bind_param('s', $username);
$stmt->execute();
if ($stmt->get_result()->fetch_assoc()) {
json_response('err', 'Username sudah digunakan.', [], 409);
}
$hash = password_hash($password, PASSWORD_DEFAULT);
$stmt = $koneksi->prepare("INSERT INTO users (nama, username, password, role, status_akun) VALUES (?,?,?,?,?)");
$stmt->bind_param('sssss', $nama, $username, $hash, $role, $status_akun);
if (!$stmt->execute()) {
json_response('err', 'Gagal membuat akun: ' . $stmt->error, [], 500);
}
json_response('ok', 'Akun berhasil dibuat.', [
'id' => $stmt->insert_id,
'nama' => $nama,
'username' => $username,
'role' => $role,
'status_akun' => $status_akun
]);
?>