# Система авторизации и ролей

## Описание

Система авторизации построена на Laravel Sanctum с поддержкой ролей через отдельную таблицу `roles` и связующую таблицу `role_user`.

## Роли

Система поддерживает 4 роли:
- **admin** - Администратор (полный доступ)
- **manager** - Менеджер (управление заказами, бронированиями, меню)
- **waiter** - Официант (просмотр и обработка заказов, бронирований)
- **customer** - Клиент (обычный пользователь)

## Структура базы данных

### Таблица `roles`
- `id` - ID роли
- `name` - Название роли (на русском)
- `slug` - Уникальный идентификатор роли (admin, manager, waiter, customer)
- `description` - Описание роли
- `created_at`, `updated_at`

### Таблица `role_user` (pivot)
- `id` - ID записи
- `user_id` - ID пользователя
- `role_id` - ID роли
- `created_at`, `updated_at`

### Таблица `users` (обновлена)
- Добавлено поле `phone` (nullable)

## API Endpoints

### Публичные маршруты

#### Регистрация
```http
POST /api/auth/register
Content-Type: application/json

{
  "name": "Иван Иванов",
  "email": "ivan@example.com",
  "phone": "+1234567890",
  "password": "password123",
  "password_confirmation": "password123"
}
```

**Ответ:**
```json
{
  "success": true,
  "message": "Регистрация успешна",
  "data": {
    "user": {
      "id": 1,
      "name": "Иван Иванов",
      "email": "ivan@example.com",
      "phone": "+1234567890",
      "roles": [
        {
          "id": 4,
          "name": "Клиент",
          "slug": "customer"
        }
      ]
    },
    "token": "1|xxxxxxxxxxxx",
    "token_type": "Bearer"
  }
}
```

#### Вход
```http
POST /api/auth/login
Content-Type: application/json

{
  "email": "ivan@example.com",
  "password": "password123"
}
```

**Ответ:**
```json
{
  "success": true,
  "message": "Вход выполнен успешно",
  "data": {
    "user": {
      "id": 1,
      "name": "Иван Иванов",
      "email": "ivan@example.com",
      "roles": [...]
    },
    "token": "1|xxxxxxxxxxxx",
    "token_type": "Bearer"
  }
}
```

### Защищенные маршруты (требуется токен)

#### Выход
```http
POST /api/auth/logout
Authorization: Bearer {token}
```

#### Получить текущего пользователя
```http
GET /api/auth/user
Authorization: Bearer {token}
```

#### Обновить профиль
```http
PUT /api/auth/profile
Authorization: Bearer {token}
Content-Type: application/json

{
  "name": "Новое имя",
  "email": "newemail@example.com",
  "phone": "+9876543210",
  "password": "newpassword123",
  "password_confirmation": "newpassword123"
}
```

## Использование в контроллерах

### Проверка роли в контроллере

```php
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

class SomeController extends Controller
{
    public function index(Request $request)
    {
        // Проверка одной роли
        if ($request->user()->hasRole('admin')) {
            // Код для администратора
        }

        // Проверка нескольких ролей
        if ($request->user()->hasAnyRole(['admin', 'manager'])) {
            // Код для администратора или менеджера
        }

        return response()->json(['data' => '...']);
    }
}
```

### Использование middleware в маршрутах

```php
// Одна роль
Route::middleware(['auth:sanctum', 'role:admin'])->group(function () {
    Route::get('/admin/dashboard', [AdminController::class, 'dashboard']);
});

// Несколько ролей
Route::middleware(['auth:sanctum', 'role:admin,manager'])->group(function () {
    Route::get('/management/orders', [OrderController::class, 'index']);
});
```

### Назначение ролей пользователю

```php
use App\Models\User;
use App\Models\Role;

$user = User::find(1);

// По slug
$user->assignRole('admin');

// По объекту Role
$role = Role::where('slug', 'manager')->first();
$user->assignRole($role);

// Удаление роли
$user->removeRole('admin');
```

## Методы модели User

### `hasRole($role)`
Проверяет, имеет ли пользователь определенную роль.
- `$role` может быть строкой (slug) или объектом Role

### `hasAnyRole(array $roles)`
Проверяет, имеет ли пользователь одну из указанных ролей.
- `$roles` - массив slug ролей

### `assignRole($role)`
Назначает роль пользователю.
- `$role` может быть строкой (slug) или объектом Role

### `removeRole($role)`
Удаляет роль у пользователя.
- `$role` может быть строкой (slug) или объектом Role

### `roles()`
Возвращает связь с ролями (belongsToMany).

## Установка и настройка

### 1. Запуск миграций
```bash
php artisan migrate
```

### 2. Заполнение ролей
```bash
php artisan db:seed --class=RoleSeeder
```

### 3. Создание тестовых пользователей (опционально)
```bash
php artisan db:seed --class=AdminUserSeeder
```

Тестовые пользователи:
- Администратор: `admin@kartulide.com` / `password`
- Менеджер: `manager@kartulide.com` / `password`
- Официант: `waiter@kartulide.com` / `password`

## Примеры использования

### Создание пользователя с ролью
```php
use App\Models\User;
use App\Models\Role;
use Illuminate\Support\Facades\Hash;

$user = User::create([
    'name' => 'Новый пользователь',
    'email' => 'user@example.com',
    'password' => Hash::make('password'),
]);

$user->assignRole('customer');
```

### Проверка доступа в контроллере
```php
public function store(Request $request)
{
    if (!$request->user()->hasAnyRole(['admin', 'manager'])) {
        return response()->json([
            'success' => false,
            'message' => 'Доступ запрещен'
        ], 403);
    }

    // Логика создания...
}
```

### Получение пользователей с определенной ролью
```php
use App\Models\Role;

$adminRole = Role::where('slug', 'admin')->first();
$admins = $adminRole->users;
```

## Безопасность

- Все пароли хешируются через bcrypt
- Токены создаются через Laravel Sanctum
- Middleware `CheckRole` проверяет авторизацию и роли
- Валидация всех входных данных
- Rate limiting для API (настроен в `RouteServiceProvider`)






