bp/app/Database/Seeds/SetSystemRoleSeeder.php

123 lines
3.9 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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