64 lines
2.1 KiB
PHP
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
|
|
]);
|
|
?>
|