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;
|
|
}
|
|
} |