Files
bp/app/Database/Seeds/SetSystemRoleSeeder.php
T

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