%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµùÕ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream
<?php
/**
* Helper autentikasi untuk panel admin/CMS.
*/
/**
* Apakah admin sudah login?
*/
function admin_logged_in(): bool
{
return !empty($_SESSION['admin']['id']);
}
/**
* Data admin yang sedang login (atau null).
*
* @return array<string, mixed>|null
*/
function current_admin(): ?array
{
return $_SESSION['admin'] ?? null;
}
/**
* Wajibkan login admin. Bila belum, redirect ke halaman login.
*/
function require_admin(): void
{
if (!admin_logged_in()) {
set_flash('error', 'Silakan masuk terlebih dahulu untuk mengakses halaman tersebut.');
redirect('admin/login.php');
}
}
/**
* Membuat sesi login admin.
*
* @param array<string, mixed> $admin
*/
function login_admin(array $admin): void
{
session_regenerate_id(true);
// Ambil nama UPD bila user terikat pada sebuah UPD.
$updNama = null;
if (!empty($admin['upd_id'])) {
$stmt = db()->prepare('SELECT nama FROM upd WHERE id = ? LIMIT 1');
$stmt->execute([(int) $admin['upd_id']]);
$updNama = $stmt->fetchColumn() ?: null;
}
$_SESSION['admin'] = [
'id' => (int) $admin['id'],
'nama' => $admin['nama'],
'username' => $admin['username'],
'email' => $admin['email'],
'role' => $admin['role'],
'upd_id' => !empty($admin['upd_id']) ? (int) $admin['upd_id'] : null,
'upd_nama' => $updNama,
'foto' => $admin['foto'] ?? null,
];
}
/**
* Apakah user adalah Super Administrator (akses penuh, termasuk kelola user/UPD)?
*/
function is_superadmin(): bool
{
return (current_admin()['role'] ?? '') === 'superadmin';
}
/**
* Apakah user merupakan admin pusat (PPID Utama): superadmin atau admin.
* Admin pusat mengelola seluruh data lintas UPD.
*/
function is_central(): bool
{
return in_array(current_admin()['role'] ?? '', ['superadmin', 'admin'], true);
}
/**
* Apakah user adalah admin UPD (PPID Pembantu) yang di-scope ke satu UPD?
*/
function is_upd_admin(): bool
{
return (current_admin()['role'] ?? '') === 'upd';
}
/**
* ID UPD milik user yang sedang login (null bila admin pusat / tidak terikat UPD).
*/
function current_upd_id(): ?int
{
$u = current_admin();
return !empty($u['upd_id']) ? (int) $u['upd_id'] : null;
}
/**
* Nama UPD user yang sedang login (atau null).
*/
function current_upd_nama(): ?string
{
return current_admin()['upd_nama'] ?? null;
}
/**
* Wajibkan akses Super Administrator. Bila tidak, tolak akses.
*/
function require_superadmin(): void
{
require_admin();
if (!is_superadmin()) {
http_response_code(403);
set_flash('error', 'Anda tidak memiliki hak akses untuk halaman tersebut.');
redirect('admin/index.php');
}
}
/**
* Wajibkan akses admin pusat (PPID Utama). Admin UPD ditolak.
*/
function require_central(): void
{
require_admin();
if (!is_central()) {
http_response_code(403);
set_flash('error', 'Halaman tersebut hanya untuk admin PPID Utama.');
redirect('admin/index.php');
}
}
/**
* Akhiri sesi admin.
*/
function logout_admin(): void
{
unset($_SESSION['admin']);
session_regenerate_id(true);
}
/**
* URL avatar admin (gunakan ui-avatars bila tak ada foto).
*/
function admin_avatar(?array $admin): string
{
$admin = $admin ?? current_admin();
if (!empty($admin['foto'])) {
return UPLOAD_URL . '/avatar/' . $admin['foto'];
}
$nama = urlencode($admin['nama'] ?? 'Admin');
return "https://ui-avatars.com/api/?name={$nama}&background=15803d&color=fff";
}
/**
* Label role yang ramah dibaca.
*/
function role_label(string $role): string
{
return match ($role) {
'superadmin' => 'Super Administrator',
'admin' => 'Administrator',
'upd' => 'Admin UPD',
'verifikator' => 'Verifikator',
default => ucfirst($role),
};
}