123 lines
3.9 KiB
PHP
123 lines
3.9 KiB
PHP
<?php
|
||
|
||
namespace App\Database\Seeds;
|
||
|
||
use CodeIgniter\Database\Seeder;
|
||
use App\Models\UserModel;
|
||
|
||
/**
|
||
* Seeder для назначения системных ролей пользователям
|
||
*
|
||
* Использование:
|
||
* php spark db:seed "App\Database\Seeds\SetSystemRoleSeeder" -email=admin@example.com -role=superadmin
|
||
*
|
||
* Только email (по умолчанию роль superadmin):
|
||
* php spark db:seed "App\Database\Seeds\SetSystemRoleSeeder" -email=admin@example.com
|
||
*/
|
||
class SetSystemRoleSeeder extends Seeder
|
||
{
|
||
/**
|
||
* Системные роли
|
||
*/
|
||
public const ROLE_USER = 'user';
|
||
public const ROLE_ADMIN = 'admin';
|
||
public const ROLE_SUPERADMIN = 'superadmin';
|
||
|
||
/**
|
||
* {@inheritDoc}
|
||
*/
|
||
public function run()
|
||
{
|
||
// Получаем параметры из командной строки
|
||
$email = $this->parseArg('email');
|
||
$role = $this->parseArg('role') ?? self::ROLE_SUPERADMIN;
|
||
|
||
if (empty($email)) {
|
||
echo "Ошибка: Не указан email пользователя\n";
|
||
echo "\n";
|
||
echo "Использование:\n";
|
||
echo " php spark db:seed \"App\Database\Seeds\SetSystemRoleSeeder\" -email=admin@example.com -role=superadmin\n";
|
||
echo "\n";
|
||
echo "Доступные роли: user, admin, superadmin\n";
|
||
echo "По умолчанию: superadmin\n";
|
||
return;
|
||
}
|
||
|
||
$this->assignRole($email, $role);
|
||
}
|
||
|
||
/**
|
||
* Парсинг аргумента из командной строки
|
||
*/
|
||
protected function parseArg(string $name): ?string
|
||
{
|
||
global $argv;
|
||
|
||
foreach ($argv as $arg) {
|
||
// Формат: -email=value
|
||
if (preg_match("/^-{$name}=(.+)$/", $arg, $matches)) {
|
||
return $matches[1];
|
||
}
|
||
}
|
||
|
||
return null;
|
||
}
|
||
|
||
/**
|
||
* Назначение роли пользователю по email
|
||
*/
|
||
public function assignRole(string $email, string $role): bool
|
||
{
|
||
$userModel = new UserModel();
|
||
|
||
// Ищем пользователя по email
|
||
$user = $userModel->where('email', $email)->first();
|
||
|
||
if (!$user) {
|
||
echo "Ошибка: Пользователь с email '{$email}' не найден в базе данных\n";
|
||
return false;
|
||
}
|
||
|
||
// Отладка
|
||
echo "DEBUG: Found user ID = " . $user['id'] . "\n";
|
||
echo "DEBUG: Current system_role = " . ($user['system_role'] ?? 'NULL') . "\n";
|
||
|
||
// Валидируем роль
|
||
$validRoles = [self::ROLE_USER, self::ROLE_ADMIN, self::ROLE_SUPERADMIN];
|
||
if (!in_array($role, $validRoles)) {
|
||
echo "Ошибка: Неизвестная роль '{$role}'. Доступные роли: " . implode(', ', $validRoles) . "\n";
|
||
return false;
|
||
}
|
||
|
||
// Используем DB Builder для обновления
|
||
$db = \Config\Database::connect();
|
||
$result = $db->table('users')
|
||
->where('id', $user['id'])
|
||
->set('system_role', $role)
|
||
->update();
|
||
|
||
if (!$result) {
|
||
echo "Ошибка обновления\n";
|
||
return false;
|
||
}
|
||
|
||
// Проверяем что обновилось
|
||
$updatedUser = $userModel->find($user['id']);
|
||
echo "DEBUG: New system_role = " . ($updatedUser['system_role'] ?? 'NULL') . "\n";
|
||
|
||
$roleLabels = [
|
||
self::ROLE_USER => 'Пользователь',
|
||
self::ROLE_ADMIN => 'Администратор',
|
||
self::ROLE_SUPERADMIN => 'Суперадмин',
|
||
];
|
||
|
||
$roleLabel = $roleLabels[$role] ?? $role;
|
||
|
||
echo "Успех!\n";
|
||
echo " Email: {$email}\n";
|
||
echo " User ID: {$user['id']}\n";
|
||
echo " Назначенная роль: {$roleLabel}\n";
|
||
|
||
return true;
|
||
}
|
||
} |