Files
2026-09-16 23:20:08 +07:00

168 lines
6.2 KiB
PHP

<?php
require_once '../includes/auth.php';
require_once '../includes/db.php';
require_once '../includes/api_helper.php';
require_once '../includes/logger.php';
// Check if user is admin
if (!isAdmin()) {
sendJson(403, ['error' => 'Permission denied. Admins only.']);
}
$method = $_SERVER['REQUEST_METHOD'];
// Function to send JSON response
function sendJson($statusCode, $data) {
http_response_code($statusCode);
header('Content-Type: application/json');
echo json_encode($data);
exit();
}
// Function to validate password strength
function validatePassword($password) {
if (strlen($password) < 6) return false;
return true;
}
switch ($method) {
case 'GET':
// Read (List)
try {
$stmt = $pdo->query("SELECT id, username, id_card, full_name, role, created_at FROM users ORDER BY created_at DESC");
$users = $stmt->fetchAll();
sendJson(200, ['users' => $users]);
} catch (PDOException $e) {
sendJson(500, ['error' => 'Database error: ' . $e->getMessage()]);
}
break;
case 'POST':
// Create
$data = json_decode(file_get_contents('php://input'), true);
$id_card = trim($data['id_card'] ?? '');
$full_name = trim($data['full_name'] ?? '');
$role = trim($data['role'] ?? 'user');
$password = $data['password'] ?? '';
if (empty($id_card) || empty($full_name) || empty($password)) {
sendJson(400, ['error' => 'Missing required fields']);
}
if (strlen($id_card) !== 13) {
sendJson(400, ['error' => 'ID card must be 13 digits']);
}
if (!validatePassword($password)) {
sendJson(400, ['error' => 'รหัสผ่านต้องมีความยาวไม่น้อยกว่า 6 ตัวอักษร']);
}
try {
// Check if id_card already exists
$stmt = $pdo->prepare("SELECT id FROM users WHERE id_card = ?");
$stmt->execute([$id_card]);
if ($stmt->fetch()) {
sendJson(400, ['error' => 'ID card already exists']);
}
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$username = $id_card; // Use id_card as username fallback if username is NOT NULL
$stmt = $pdo->prepare("INSERT INTO users (username, id_card, password, full_name, role) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$username, $id_card, $hashedPassword, $full_name, $role]);
$newUserId = $pdo->lastInsertId();
logActivity("Create User ({$id_card})", 'users', $newUserId);
sendJson(201, ['message' => 'User created successfully', 'id' => $newUserId]);
} catch (PDOException $e) {
sendJson(500, ['error' => 'Database error: ' . $e->getMessage()]);
}
break;
case 'PUT':
// Update
$data = json_decode(file_get_contents('php://input'), true);
$id = $data['id'] ?? null;
if (!$id) {
sendJson(400, ['error' => 'User ID is required']);
}
$id_card = trim($data['id_card'] ?? '');
$full_name = trim($data['full_name'] ?? '');
$role = trim($data['role'] ?? 'user');
$password = $data['password'] ?? '';
if (empty($id_card) || empty($full_name)) {
sendJson(400, ['error' => 'Missing required fields']);
}
if (strlen($id_card) !== 13) {
sendJson(400, ['error' => 'ID card must be 13 digits']);
}
try {
// Check if id_card is taken by someone else
$stmt = $pdo->prepare("SELECT id FROM users WHERE id_card = ? AND id != ?");
$stmt->execute([$id_card, $id]);
if ($stmt->fetch()) {
sendJson(400, ['error' => 'ID card is already in use by another user']);
}
if (!empty($password)) {
if (!validatePassword($password)) {
sendJson(400, ['error' => 'รหัสผ่านต้องมีความยาวไม่น้อยกว่า 6 ตัวอักษร']);
}
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("UPDATE users SET id_card = ?, full_name = ?, role = ?, password = ? WHERE id = ?");
$stmt->execute([$id_card, $full_name, $role, $hashedPassword, $id]);
} else {
$stmt = $pdo->prepare("UPDATE users SET id_card = ?, full_name = ?, role = ? WHERE id = ?");
$stmt->execute([$id_card, $full_name, $role, $id]);
}
logActivity("Update User ({$id_card})", 'users', $id);
sendJson(200, ['message' => 'User updated successfully']);
} catch (PDOException $e) {
sendJson(500, ['error' => 'Database error: ' . $e->getMessage()]);
}
break;
case 'DELETE':
// Delete
$id = $_GET['id'] ?? null;
if (!$id) {
sendJson(400, ['error' => 'User ID is required']);
}
// Prevent deleting oneself
if ($id == $_SESSION['user_id']) {
sendJson(400, ['error' => 'Cannot delete your own account']);
}
try {
// ดึงชื่อก่อนลบ
$stmtName = $pdo->prepare("SELECT id_card FROM users WHERE id = ?");
$stmtName->execute([$id]);
$delUser = $stmtName->fetch();
$delIdCard = $delUser ? $delUser['id_card'] : $id;
$stmt = $pdo->prepare("DELETE FROM users WHERE id = ?");
$stmt->execute([$id]);
logActivity("Delete User ({$delIdCard})", 'users', $id);
sendJson(200, ['message' => 'User deleted successfully']);
} catch (PDOException $e) {
sendJson(500, ['error' => 'Database error: ' . $e->getMessage()]);
}
break;
default:
sendJson(405, ['error' => 'Method Not Allowed']);
}