Files
test_test/database/seeders/RolesAndPermissionsSeeder.php
2026-04-06 18:44:02 +05:00

280 lines
11 KiB
PHP
Raw 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 Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\Role;
use App\Models\Permission;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use function Symfony\Component\String\s;
class RolesAndPermissionsSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void {
$this->cleanTables();
$this->createPermissions();
$this->createRoles();
$this->assignPermissionsToRoles();
}
private function cleanTables()
{
DB::statement('SET FOREIGN_KEY_CHECKS=0');
DB::table('permission_role')->truncate();
DB::table('role_user')->truncate();
DB::table('permissions')->truncate();
DB::table('roles')->truncate();
DB::statement('SET FOREIGN_KEY_CHECKS=1');
}
private function createPermissions()
{
$permissions = [
// ========== ЛИЧНЫЙ КАБИНЕТ ==========
[
'name' => 'Доступ в личный кабинет',
'slug' => 'cabinet_access',
'group' => 'cabinet',
'description' => 'Возможность входить в личный кабинет и просматривать свои данные'
],
// ========== ЗАКАЗЫ ==========
[
'name' => 'Просматривать заказы',
'slug' => 'view_orders',
'group' => 'orders',
'description' => 'Просмотр списка заказов'
],
[
'name' => 'Редактировать заказы',
'slug' => 'edit_orders',
'group' => 'orders',
'description' => 'Редактирование заказов (статус, удаление, подтверждение)'
],
[
'name' => 'Оформлять заказы',
'slug' => 'checkout',
'group' => 'orders',
'description' => 'Оформление заказов на сайте'
],
// ========== КОРЗИНА ==========
[
'name' => 'Управлять корзиной',
'slug' => 'manage_cart',
'group' => 'cart',
'description' => 'Добавление/удаление товаров из корзины'
],
// ========== ТОВАРЫ ==========
[
'name' => 'Добавлять товары',
'slug' => 'create_products',
'group' => 'products',
'description' => 'Создание новых товаров'
],
[
'name' => 'Редактировать товары',
'slug' => 'edit_products',
'group' => 'products',
'description' => 'Редактирование товаров'
],
[
'name' => 'Управлять количеством товара',
'slug' => 'manage_stock',
'group' => 'products',
'description' => 'Изменение остатков товаров на складе'
],
// ========== ПОЛЬЗОВАТЕЛИ ==========
[
'name' => 'Просматривать пользователей',
'slug' => 'view_users',
'group' => 'users',
'description' => 'Просмотр списка пользователей'
],
[
'name' => 'Создавать пользователей',
'slug' => 'create_users',
'group' => 'users',
'description' => 'Создание новых пользователей'
],
// ========== РОЛИ И ПРАВА ==========
[
'name' => 'Управлять ролями',
'slug' => 'manage_roles',
'group' => 'rbac',
'description' => 'Создание/редактирование ролей'
],
[
'name' => 'Управлять правами',
'slug' => 'manage_permissions',
'group' => 'rbac',
'description' => 'Создание/редактирование прав доступа'
],
// ========== МАГАЗИН ==========
[
'name' => 'Редактировать данные магазина',
'slug' => 'edit_shop_settings',
'group' => 'shop',
'description' => 'Изменение настроек магазина'
],
// ========== ДОСТУП В АДМИНКУ ==========
[
'name' => 'Доступ в админ-панель',
'slug' => 'admin_access',
'group' => 'admin',
'description' => 'Возможность входить в административную панель'
],
];
foreach ($permissions as $permission) {
Permission::firstOrCreate(
['slug' => $permission['slug']],
$permission
);
$this->command->info("✓ Создано право: {$permission['name']}");
}
}
private function createRoles()
{
$roles = [
[
'name' => 'Супер администратор',
'slug' => 'super_admin',
'description' => 'Полный доступ ко всем функциям системы (обходит все проверки прав)'
],
[
'name' => 'Администратор магазина',
'slug' => 'shop_admin',
'description' => 'Полное управление магазином, товарами и заказами'
],
[
'name' => 'Менеджер по товарам',
'slug' => 'product_manager',
'description' => 'Управление каталогом товаров'
],
[
'name' => 'Менеджер по заказам',
'slug' => 'order_manager',
'description' => 'Обработка заказов'
],
[
'name' => 'Кладовщик',
'slug' => 'warehouse_manager',
'description' => 'Управление остатками товаров'
],
[
'name' => 'Зарегистрированный пользователь',
'slug' => 'registered_user',
'description' => 'Обычный пользователь сайта'
],
];
foreach ($roles as $roleData) {
Role::firstOrCreate(
['slug' => $roleData['slug']],
$roleData
);
$this->command->info("✓ Создана роль: {$roleData['name']}");
}
}
private function assignPermissionsToRoles()
{
// ============================================
// АДМИНИСТРАТОР МАГАЗИНА
// ============================================
$shopAdmin = Role::where('slug', 'shop_admin')->first();
$shopAdmin->permissions()->sync(
Permission::whereIn('slug', [
'admin_access',
'cabinet_access',
'view_orders',
'edit_orders',
'checkout',
'manage_cart',
'create_products',
'edit_products',
'manage_stock',
'view_users',
'create_users',
'manage_roles',
'manage_permissions',
'edit_shop_settings',
])->pluck('id')
);
$this->command->info('✓ Назначены права для Администратора магазина');
// ============================================
// МЕНЕДЖЕР ПО ТОВАРАМ
// ============================================
$productManager = Role::where('slug', 'product_manager')->first();
$productManager->permissions()->sync(
Permission::whereIn('slug', [
'admin_access',
'cabinet_access',
'create_products',
'edit_products',
'view_orders',
])->pluck('id')
);
$this->command->info('✓ Назначены права для Менеджера по товарам');
// ============================================
// МЕНЕДЖЕР ПО ЗАКАЗАМ
// ============================================
$orderManager = Role::where('slug', 'order_manager')->first();
$orderManager->permissions()->sync(
Permission::whereIn('slug', [
'admin_access',
'cabinet_access',
'view_orders',
'edit_orders',
'checkout',
'view_users',
])->pluck('id')
);
$this->command->info('✓ Назначены права для Менеджера по заказам');
// ============================================
// КЛАДОВЩИК
// ============================================
$warehouseManager = Role::where('slug', 'warehouse_manager')->first();
$warehouseManager->permissions()->sync(
Permission::whereIn('slug', [
'admin_access',
'cabinet_access',
'manage_stock',
'view_orders',
])->pluck('id')
);
$this->command->info('✓ Назначены права для Кладовщика');
// ============================================
// ЗАРЕГИСТРИРОВАННЫЙ ПОЛЬЗОВАТЕЛЬ
// ============================================
$registeredUser = Role::where('slug', 'registered_user')->first();
$registeredUser->permissions()->sync(
Permission::whereIn('slug', [
'cabinet_access',
'manage_cart',
'checkout',
])->pluck('id')
);
$this->command->info('✓ Назначены права для Зарегистрированного пользователя');
}
}