268 lines
9.5 KiB
PHP
268 lines
9.5 KiB
PHP
<?php
|
|
|
|
ini_set('display_errors', 1);
|
|
ini_set('display_startup_errors', 1);
|
|
error_reporting(E_ALL);
|
|
|
|
class UserModel
|
|
{
|
|
protected static $db;
|
|
|
|
public static function setDb($pdo)
|
|
{
|
|
self::$db = $pdo;
|
|
}
|
|
|
|
/**
|
|
* ყველა მომხმარებლის მიღება
|
|
*/
|
|
public static function getAllUsers()
|
|
{
|
|
$stmt = self::$db->query("SELECT * FROM users ORDER BY created_at DESC");
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* კონკრეტული მომხმარებლის მიღება ID-ით
|
|
*/
|
|
public static function getUserById($id)
|
|
{
|
|
$stmt = self::$db->prepare("SELECT * FROM users WHERE id = ?");
|
|
$stmt->execute([$id]);
|
|
return $stmt->fetch(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლის მიღება ელ.ფოსტით
|
|
*/
|
|
public static function getUserByEmail($email)
|
|
{
|
|
$stmt = self::$db->prepare("SELECT * FROM users WHERE email = ?");
|
|
$stmt->execute([$email]);
|
|
return $stmt->fetch(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* ახალი მომხმარებლის დამატება
|
|
*/
|
|
public static function createUser($data)
|
|
{
|
|
// ვამოწმებთ არსებობს თუ არა ასეთი ელ.ფოსტა
|
|
if (self::getUserByEmail($data['email'])) {
|
|
throw new Exception("მომხმარებელი ამ ელ.ფოსტით უკვე არსებობს");
|
|
}
|
|
|
|
$hashedPassword = password_hash($data['password'], PASSWORD_DEFAULT);
|
|
|
|
$stmt = self::$db->prepare("
|
|
INSERT INTO users (first_name, last_name, email, password, role, is_active)
|
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
");
|
|
|
|
return $stmt->execute([
|
|
$data['first_name'],
|
|
$data['last_name'],
|
|
$data['email'],
|
|
$hashedPassword,
|
|
$data['role'] ?? 'user',
|
|
$data['is_active'] ?? 1
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლის განახლება
|
|
*/
|
|
public static function updateUser($id, $data)
|
|
{
|
|
// ვამოწმებთ ელ.ფოსტის უნიკალურობას (თუ შეიცვალა)
|
|
$currentUser = self::getUserById($id);
|
|
if (!$currentUser) {
|
|
throw new Exception("მომხმარებელი ვერ მოიძებნა");
|
|
}
|
|
|
|
if ($currentUser['email'] !== $data['email']) {
|
|
$existingUser = self::getUserByEmail($data['email']);
|
|
if ($existingUser && $existingUser['id'] != $id) {
|
|
throw new Exception("მომხმარებელი ამ ელ.ფოსტით უკვე არსებობს");
|
|
}
|
|
}
|
|
|
|
$updateFields = [
|
|
'first_name' => $data['first_name'],
|
|
'last_name' => $data['last_name'],
|
|
'email' => $data['email'],
|
|
'role' => $data['role'] ?? 'user',
|
|
'is_active' => $data['is_active'] ?? 1
|
|
];
|
|
|
|
// თუ ახალი პაროლი არის მითითებული
|
|
if (!empty($data['password'])) {
|
|
$updateFields['password'] = password_hash($data['password'], PASSWORD_DEFAULT);
|
|
$sql = "UPDATE users SET first_name = ?, last_name = ?, email = ?, password = ?, role = ?, is_active = ?, updated_at = NOW() WHERE id = ?";
|
|
$params = array_values($updateFields);
|
|
$params[] = $id;
|
|
} else {
|
|
unset($updateFields['password']);
|
|
$sql = "UPDATE users SET first_name = ?, last_name = ?, email = ?, role = ?, is_active = ?, updated_at = NOW() WHERE id = ?";
|
|
$params = array_values($updateFields);
|
|
$params[] = $id;
|
|
}
|
|
|
|
$stmt = self::$db->prepare($sql);
|
|
return $stmt->execute($params);
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლის წაშლა
|
|
*/
|
|
public static function deleteUser($id)
|
|
{
|
|
// ვამოწმებთ არ არის თუ არა ეს უკანასკნელი ადმინი
|
|
$admins = self::getAdminUsers();
|
|
$userToDelete = self::getUserById($id);
|
|
|
|
if ($userToDelete['role'] === 'admin' && count($admins) <= 1) {
|
|
throw new Exception("ვერ შეიძლება უკანასკნელი ადმინისტრატორის წაშლა");
|
|
}
|
|
|
|
$stmt = self::$db->prepare("DELETE FROM users WHERE id = ?");
|
|
return $stmt->execute([$id]);
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლის სტატუსის ცვლილება
|
|
*/
|
|
public static function toggleUserStatus($id)
|
|
{
|
|
$user = self::getUserById($id);
|
|
if (!$user) {
|
|
throw new Exception("მომხმარებელი ვერ მოიძებნა");
|
|
}
|
|
|
|
$newStatus = $user['is_active'] ? 0 : 1;
|
|
|
|
// ვამოწმებთ ადმინების რაოდენობას
|
|
if ($user['role'] === 'admin' && $user['is_active'] && $newStatus === 0) {
|
|
$activeAdmins = self::getActiveAdminUsers();
|
|
if (count($activeAdmins) <= 1) {
|
|
throw new Exception("ვერ შეიძლება უკანასკნელი აქტიური ადმინისტრატორის გამორთვა");
|
|
}
|
|
}
|
|
|
|
$stmt = self::$db->prepare("UPDATE users SET is_active = ? WHERE id = ?");
|
|
return $stmt->execute([$newStatus, $id]);
|
|
}
|
|
|
|
/**
|
|
* პაროლის შეცვლა
|
|
*/
|
|
public static function changePassword($id, $currentPassword, $newPassword)
|
|
{
|
|
$user = self::getUserById($id);
|
|
if (!$user) {
|
|
throw new Exception("მომხმარებელი ვერ მოიძებნა");
|
|
}
|
|
|
|
if (!password_verify($currentPassword, $user['password'])) {
|
|
throw new Exception("მიმდინარე პაროლი არასწორია");
|
|
}
|
|
|
|
$hashedPassword = password_hash($newPassword, PASSWORD_DEFAULT);
|
|
$stmt = self::$db->prepare("UPDATE users SET password = ?, updated_at = NOW() WHERE id = ?");
|
|
return $stmt->execute([$hashedPassword, $id]);
|
|
}
|
|
|
|
/**
|
|
* ადმინისტრატორების მიღება
|
|
*/
|
|
public static function getAdminUsers()
|
|
{
|
|
$stmt = self::$db->prepare("SELECT * FROM users WHERE role = 'admin'");
|
|
$stmt->execute();
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* აქტიური ადმინისტრატორების მიღება
|
|
*/
|
|
public static function getActiveAdminUsers()
|
|
{
|
|
$stmt = self::$db->prepare("SELECT * FROM users WHERE role = 'admin' AND is_active = 1");
|
|
$stmt->execute();
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლების სტატისტიკა
|
|
*/
|
|
public static function getUserStats()
|
|
{
|
|
$stats = [];
|
|
|
|
// სულ მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users");
|
|
$stats['total'] = $stmt->fetchColumn();
|
|
|
|
// აქტიური მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE is_active = 1");
|
|
$stats['active'] = $stmt->fetchColumn();
|
|
|
|
// ადმინისტრატორები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE role = 'admin'");
|
|
$stats['admins'] = $stmt->fetchColumn();
|
|
|
|
// ამ თვის ახალი მომხმარებლები
|
|
$stmt = self::$db->query("SELECT COUNT(*) FROM users WHERE created_at >= DATE_FORMAT(NOW(), '%Y-%m-01')");
|
|
$stats['this_month'] = $stmt->fetchColumn();
|
|
|
|
return $stats;
|
|
}
|
|
|
|
/**
|
|
* ხელმისაწვდომი როლები
|
|
*/
|
|
public static function getAvailableRoles()
|
|
{
|
|
return [
|
|
'admin' => 'ადმინისტრატორი',
|
|
'manager' => 'მენეჯერი',
|
|
'user' => 'მომხმარებელი',
|
|
'guest' => 'სტუმარი'
|
|
];
|
|
}
|
|
|
|
/**
|
|
* მომხმარებლის search და filter
|
|
*/
|
|
public static function searchUsers($search = '', $role = '', $status = '')
|
|
{
|
|
$sql = "SELECT * FROM users WHERE 1=1";
|
|
$params = [];
|
|
|
|
if (!empty($search)) {
|
|
$sql .= " AND (first_name LIKE ? OR last_name LIKE ? OR email LIKE ?)";
|
|
$searchTerm = "%$search%";
|
|
$params[] = $searchTerm;
|
|
$params[] = $searchTerm;
|
|
$params[] = $searchTerm;
|
|
}
|
|
|
|
if (!empty($role)) {
|
|
$sql .= " AND role = ?";
|
|
$params[] = $role;
|
|
}
|
|
|
|
if ($status !== '') {
|
|
$sql .= " AND is_active = ?";
|
|
$params[] = (int)$status;
|
|
}
|
|
|
|
$sql .= " ORDER BY created_at DESC";
|
|
|
|
$stmt = self::$db->prepare($sql);
|
|
$stmt->execute($params);
|
|
return $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
}
|
|
}
|
|
?>
|