467363d651
Made-with: Cursor
128 lines
4.6 KiB
PHP
128 lines
4.6 KiB
PHP
<?php
|
|
declare(strict_types=1);
|
|
|
|
require __DIR__ . '/_common.php';
|
|
|
|
require_login();
|
|
|
|
$me = current_admin();
|
|
if (!$me) {
|
|
json_response(['ok' => false, 'error' => 'Unauthorized'], 401);
|
|
}
|
|
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
|
|
if ($method === 'GET') {
|
|
$list = array_map('strip_admin', read_store()['admins'] ?? []);
|
|
json_response(['ok' => true, 'admins' => $list]);
|
|
}
|
|
|
|
if (!is_super($me)) {
|
|
json_response(['ok' => false, 'error' => 'เฉพาะ super admin จัดการบัญชีแอดมินได้'], 403);
|
|
}
|
|
|
|
if ($method === 'POST') {
|
|
$body = require_json_body();
|
|
$username = trim((string)($body['username'] ?? ''));
|
|
$password = (string)($body['password'] ?? '');
|
|
$role = ($body['role'] ?? 'admin') === 'super' ? 'super' : 'admin';
|
|
if ($role === 'super' && !is_super($me)) {
|
|
json_response(['ok' => false, 'error' => 'สร้าง super admin ได้เฉพาะ super เท่านั้น'], 403);
|
|
}
|
|
if ($username === '' || strlen($username) < 2) {
|
|
json_response(['ok' => false, 'error' => 'ชื่อผู้ใช้สั้นเกินไป'], 400);
|
|
}
|
|
if (strlen($password) < 8) {
|
|
json_response(['ok' => false, 'error' => 'รหัสผ่านอย่างน้อย 8 ตัวอักษร'], 400);
|
|
}
|
|
$store = read_store();
|
|
foreach ($store['admins'] ?? [] as $x) {
|
|
if (strcasecmp($x['username'] ?? '', $username) === 0) {
|
|
json_response(['ok' => false, 'error' => 'ชื่อผู้ใช้ซ้ำ'], 400);
|
|
}
|
|
}
|
|
$store['admins'][] = [
|
|
'id' => new_id(),
|
|
'username' => $username,
|
|
'passwordHash' => password_hash($password, PASSWORD_DEFAULT),
|
|
'role' => $role,
|
|
'createdAt' => gmdate('c'),
|
|
];
|
|
if (!write_store($store)) {
|
|
json_response(['ok' => false, 'error' => 'บันทึกไม่สำเร็จ'], 500);
|
|
}
|
|
json_response(['ok' => true]);
|
|
}
|
|
|
|
if ($method === 'PATCH') {
|
|
$body = require_json_body();
|
|
$targetId = trim((string)($body['id'] ?? ''));
|
|
$newPassword = (string)($body['newPassword'] ?? '');
|
|
if ($targetId === '') {
|
|
json_response(['ok' => false, 'error' => 'ระบุ id แอดมิน'], 400);
|
|
}
|
|
if (strlen($newPassword) < 8) {
|
|
json_response(['ok' => false, 'error' => 'รหัสใหม่อย่างน้อย 8 ตัวอักษร'], 400);
|
|
}
|
|
if ($targetId === $me['id']) {
|
|
json_response(['ok' => false, 'error' => 'เปลี่ยนรหัสตัวเองให้ใช้เมนู "เปลี่ยนรหัสผ่านของคุณ"'], 400);
|
|
}
|
|
$store = read_store();
|
|
$updated = false;
|
|
foreach ($store['admins'] ?? [] as $i => $a) {
|
|
if (($a['id'] ?? '') !== $targetId) {
|
|
continue;
|
|
}
|
|
$store['admins'][$i]['passwordHash'] = password_hash($newPassword, PASSWORD_DEFAULT);
|
|
$updated = true;
|
|
break;
|
|
}
|
|
if (!$updated) {
|
|
json_response(['ok' => false, 'error' => 'ไม่พบแอดมิน'], 404);
|
|
}
|
|
if (!write_store($store)) {
|
|
json_response(['ok' => false, 'error' => 'บันทึกไม่สำเร็จ'], 500);
|
|
}
|
|
json_response(['ok' => true, 'message' => 'ตั้งรหัสใหม่แล้ว']);
|
|
}
|
|
|
|
if ($method === 'DELETE') {
|
|
$id = trim((string)($_GET['id'] ?? ''));
|
|
if ($id === '') {
|
|
json_response(['ok' => false, 'error' => 'ระบุ id'], 400);
|
|
}
|
|
if ($id === $me['id']) {
|
|
json_response(['ok' => false, 'error' => 'ลบบัญชีตัวเองไม่ได้'], 400);
|
|
}
|
|
$store = read_store();
|
|
$admins = $store['admins'] ?? [];
|
|
$next = [];
|
|
$removed = false;
|
|
foreach ($admins as $a) {
|
|
if (($a['id'] ?? '') === $id) {
|
|
$removed = true;
|
|
continue;
|
|
}
|
|
$next[] = $a;
|
|
}
|
|
if (!$removed) {
|
|
json_response(['ok' => false, 'error' => 'ไม่พบผู้ใช้'], 404);
|
|
}
|
|
$supers = 0;
|
|
foreach ($next as $a) {
|
|
if (($a['role'] ?? '') === 'super') {
|
|
$supers++;
|
|
}
|
|
}
|
|
if ($supers < 1) {
|
|
json_response(['ok' => false, 'error' => 'ต้องมี super admin อย่างน้อย 1 คน'], 400);
|
|
}
|
|
$store['admins'] = $next;
|
|
if (!write_store($store)) {
|
|
json_response(['ok' => false, 'error' => 'บันทึกไม่สำเร็จ'], 500);
|
|
}
|
|
json_response(['ok' => true]);
|
|
}
|
|
|
|
json_response(['ok' => false, 'error' => 'Method not allowed'], 405);
|