/
delphin
/
CatRW
Обзор
Документация
Войти
/
delphin
/
CatRW
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
multilang
api/UserService.php
261 строка
10 KB
delphin
multilang add
11 мар 2026, 09:25
Верифицирован
11 мар 2026, 09:25
90e28cc
Код
Авторство
О чём код?
<?php // /api/UserService.php - ИСПРАВЛЕННАЯ ВЕРСИЯ (без email_verified) class UserService { const STATUS_ACTIVE = 'active'; const STATUS_PENDING = 'pending'; // не активен, но не забанен const STATUS_BANNED = 'banned'; const STATUS_INACTIVE = 'inactive'; // деактивирован (is_active = 0 без бана) // 1. Метод для определения статуса public static function getUserStatus($user) { if (!$user) return 'unknown'; // Заблокирован (бан) if ($user['is_active'] == 0 && !empty($user['ban_reason']) && !empty($user['banned_at'])) { return self::STATUS_BANNED; } // Деактивирован (is_active = 0 без бана) if ($user['is_active'] == 0) { return self::STATUS_INACTIVE; } // Активен (is_active = 1) return self::STATUS_ACTIVE; } // 2. getAll() - без email_verified public static function getAll($limit = 1000) { try { $sql = "SELECT id, username, email, role, full_name, language, is_active, ban_reason, banned_at, created_at, last_login FROM users ORDER BY username LIMIT " . (int)$limit; $users = Database::select($sql); // Добавляем статус каждому пользователю foreach ($users as &$user) { $user['status'] = self::getUserStatus($user); } return $users; } catch (Exception $e) { error_log("UserService::getAll error: " . $e->getMessage()); return []; } } // 3. get() public static function get($id) { try { $user = Database::selectOne(" SELECT id, username, email, role, full_name, language, is_active, ban_reason, banned_at, created_at, last_login FROM users WHERE id = :id", [':id' => $id] ); if ($user) { $user['status'] = self::getUserStatus($user); } return $user; } catch (Exception $e) { error_log("UserService::get error for id $id: " . $e->getMessage()); return null; } } // 4. search() public static function search($query) { try { if (empty($query)) { return self::getAll(); } $searchPattern = "%" . $query . "%"; $users = Database::select(" SELECT id, username, email, role, full_name, language, is_active, ban_reason, banned_at, created_at, last_login FROM users WHERE username LIKE ? OR email LIKE ? OR full_name LIKE ? ORDER BY username ", [$searchPattern, $searchPattern, $searchPattern]); // Добавляем статус foreach ($users as &$user) { $user['status'] = self::getUserStatus($user); } return $users; } catch (Exception $e) { error_log("UserService::search error: " . $e->getMessage()); return []; } } // 5. Создать пользователя public static function create($data) { try { // Валидация if (empty($data['username'])) { throw new Exception("Имя пользователя обязательно"); } if (empty($data['email'])) { throw new Exception("Email обязателен"); } if (empty($data['password'])) { throw new Exception("Пароль обязателен"); } // Проверка уникальности $existingByUsername = Database::selectOne( "SELECT id, username FROM users WHERE username = ?", [$data['username']] ); $existingByEmail = Database::selectOne( "SELECT id, email FROM users WHERE email = ?", [$data['email']] ); if ($existingByUsername) { throw new Exception("Имя пользователя '{$data['username']}' уже занято"); } if ($existingByEmail) { throw new Exception("Email '{$data['email']}' уже используется"); } // Подготовка данных $userData = [ 'username' => trim($data['username']), 'email' => trim($data['email']), 'password_hash' => password_hash($data['password'], PASSWORD_DEFAULT), 'role' => $data['role'] ?? 'editor', 'full_name' => !empty($data['full_name']) ? trim($data['full_name']) : null, 'language' => $data['language'] ?? 'ru', 'is_active' => 1 ]; return Database::insert('users', $userData); } catch (Exception $e) { error_log("UserService::create error: " . $e->getMessage()); throw $e; } } // 6. update() public static function update($id, $data) { try { // Проверяем существование пользователя $user = self::get($id); if (!$user) { throw new Exception("Пользователь #$id не найден"); } // Убираем поля, которые не должны обновляться unset($data['id'], $data['created_at'], $data['last_login']); // Если есть пароль - хэшируем if (!empty($data['password'])) { $data['password_hash'] = password_hash($data['password'], PASSWORD_DEFAULT); unset($data['password']); } // Если запрос на бан if (isset($data['ban_action'])) { if ($data['ban_action'] === 'ban') { // Блокируем $data['is_active'] = 0; $data['banned_at'] = date('Y-m-d H:i:s'); if (!empty($data['ban_reason'])) { $data['ban_reason'] = trim($data['ban_reason']); } } elseif ($data['ban_action'] === 'unban') { // Разблокируем $data['is_active'] = 1; $data['ban_reason'] = null; $data['banned_at'] = null; } unset($data['ban_action']); } // Если меняем is_active if (isset($data['is_active'])) { $data['is_active'] = $data['is_active'] ? 1 : 0; } $result = Database::update( 'users', $data, 'id = :id', [':id' => $id] ); return $result; } catch (Exception $e) { error_log("UserService::update error for id $id: " . $e->getMessage()); throw $e; } } // 7. Удаление пользователя (деактивация) public static function delete($id) { try { // Проверяем существование пользователя $user = self::get($id); if (!$user) { throw new Exception("Пользователь #$id не найден"); } // Мягкое удаление - деактивация $result = Database::update('users', ['is_active' => 0], 'id = :id', [':id' => $id] ); return [ 'type' => 'deactivated', 'message' => 'Пользователь деактивирован' ]; } catch (Exception $e) { error_log("UserService::delete error for id $id: " . $e->getMessage()); throw $e; } } // 8. Статистика public static function getStats() { try { return Database::selectOne(" SELECT COUNT(*) as total, SUM(is_active = 1) as active, SUM(is_active = 0 AND ban_reason IS NOT NULL) as banned, SUM(is_active = 0 AND ban_reason IS NULL) as inactive FROM users "); } catch (Exception $e) { error_log("UserService::getStats error: " . $e->getMessage()); return ['total' => 0, 'active' => 0, 'banned' => 0, 'inactive' => 0]; } } } ?>