You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
5.3 KiB
83 lines
5.3 KiB
<?php
|
|
header('Content-Type: application/json');
|
|
header('Access-Control-Allow-Origin: *');
|
|
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
|
|
header('Access-Control-Allow-Headers: Content-Type');
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
|
|
require_once __DIR__ . '/../../utils/Database.php';
|
|
require_once __DIR__ . '/../../utils/Helper.php';
|
|
$db = Database::getInstance();
|
|
$method = $_SERVER['REQUEST_METHOD'];
|
|
if ($method === 'GET') {
|
|
$page = isset($_GET['page']) ? max(1, (int)$_GET['page']) : 1;
|
|
$perPage = isset($_GET['perPage']) ? min(100, max(1, (int)$_GET['perPage'])) : 10;
|
|
$offset = ($page - 1) * $perPage;
|
|
$search = isset($_GET['search']) ? trim($_GET['search']) : '';
|
|
$params = [];
|
|
$where = "WHERE is_deleted = 0";
|
|
if ($search !== '') {
|
|
$where .= " AND (username LIKE ? OR email LIKE ?)";
|
|
$params[] = '%' . $search . '%';
|
|
$params[] = '%' . $search . '%';
|
|
}
|
|
$totalRow = $db->fetchOne("SELECT COUNT(*) AS cnt FROM user $where", $params);
|
|
$users = $db->fetchAll("SELECT username,email,phone,level,avatar,is_admin,is_enabled,create_time,updated_at FROM user $where ORDER BY create_time DESC LIMIT $perPage OFFSET $offset", $params);
|
|
echo json_encode(['success' => true, 'data' => ['users' => $users, 'total' => (int)$totalRow['cnt'], 'page' => $page, 'perPage' => $perPage, 'totalPages' => (int)ceil(((int)$totalRow['cnt']) / $perPage)]]);
|
|
exit;
|
|
}
|
|
if ($method === 'POST') {
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
if (isset($input['login']) && $input['login'] === true) {
|
|
$username = trim($input['username'] ?? '');
|
|
$password = $input['password'] ?? '';
|
|
if ($username === '' || $password === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
|
|
$row = $db->fetchOne("SELECT username,password,email,is_admin,is_enabled,is_deleted FROM user WHERE username = ? LIMIT 1", [$username]);
|
|
if (!$row || (int)$row['is_deleted'] === 1 || (int)$row['is_enabled'] === 0) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'unauthorized']); exit; }
|
|
if (!Helper::verifyPassword($password, $row['password'])) { http_response_code(401); echo json_encode(['success' => false, 'message' => 'unauthorized']); exit; }
|
|
$token = base64_encode(hash('sha256', $username . '|' . microtime(true) . '|' . Helper::generateRandomString(16), true));
|
|
echo json_encode(['success' => true, 'data' => ['token' => $token, 'username' => $row['username'], 'email' => $row['email'], 'is_admin' => (int)$row['is_admin']]]);
|
|
exit;
|
|
}
|
|
$username = trim($input['username'] ?? '');
|
|
$password = $input['password'] ?? '';
|
|
$email = trim($input['email'] ?? '');
|
|
if ($username === '' || $password === '' || $email === '' || !Helper::validateEmail($email)) { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
|
|
$hash = Helper::encryptPassword($password);
|
|
$db->insert("INSERT INTO user (username,password,email,level,is_admin,is_enabled,is_deleted,create_time,updated_at) VALUES (?, ?, ?, 1, 0, 1, 0, NOW(), NOW())", [$username, $hash, $email]);
|
|
echo json_encode(['success' => true, 'message' => 'created']);
|
|
exit;
|
|
}
|
|
if ($method === 'PUT') {
|
|
$input = json_decode(file_get_contents('php://input'), true);
|
|
$username = trim($input['username'] ?? '');
|
|
if ($username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
|
|
$email = isset($input['email']) ? trim($input['email']) : null;
|
|
$phone = isset($input['phone']) ? trim($input['phone']) : null;
|
|
$level = isset($input['level']) ? (int)$input['level'] : null;
|
|
$is_admin = isset($input['is_admin']) ? (int)$input['is_admin'] : null;
|
|
$is_enabled = isset($input['is_enabled']) ? (int)$input['is_enabled'] : null;
|
|
$fields = [];
|
|
$params = [];
|
|
if ($email !== null) { $fields[] = "email = ?"; $params[] = $email; }
|
|
if ($phone !== null) { $fields[] = "phone = ?"; $params[] = $phone; }
|
|
if ($level !== null) { $fields[] = "level = ?"; $params[] = $level; }
|
|
if ($is_admin !== null) { $fields[] = "is_admin = ?"; $params[] = $is_admin; }
|
|
if ($is_enabled !== null) { $fields[] = "is_enabled = ?"; $params[] = $is_enabled; }
|
|
if (isset($input['password']) && $input['password'] !== '') { $fields[] = "password = ?"; $params[] = Helper::encryptPassword($input['password']); }
|
|
if (empty($fields)) { echo json_encode(['success' => true, 'message' => 'no changes']); exit; }
|
|
$fields[] = "updated_at = NOW()";
|
|
$params[] = $username;
|
|
$db->update("UPDATE user SET " . implode(', ', $fields) . " WHERE username = ? AND is_deleted = 0", $params);
|
|
echo json_encode(['success' => true, 'message' => 'updated']);
|
|
exit;
|
|
}
|
|
if ($method === 'DELETE') {
|
|
$username = isset($_GET['username']) ? trim($_GET['username']) : '';
|
|
if ($username === '') { http_response_code(400); echo json_encode(['success' => false, 'message' => 'invalid']); exit; }
|
|
$db->update("UPDATE user SET is_deleted = 1, is_enabled = 0, updated_at = NOW() WHERE username = ? AND is_deleted = 0", [$username]);
|
|
echo json_encode(['success' => true, 'message' => 'deleted']);
|
|
exit;
|
|
}
|
|
http_response_code(405);
|
|
echo json_encode(['success' => false, 'message' => 'method not allowed']);
|