# 🔗 Интеграция фронтенда с API

## ✅ Реализованные функции

### 1. **🔐 Авторизация (AuthTab)**
- ✅ Регистрация: `POST /api/login/register`
- ✅ Вход: `POST /api/login`
- ✅ Сохранение JWT токена в `localStorage`
- ✅ Автоматическая проверка сессии

**Данные отправляются:**
```javascript
{
  login: string,
  password: string,
  firstName?: string,
  lastName?: string,
  phone?: string,
  email?: string
}
```

**Ответ:** JWT токен сохраняется как `jwt_token`

---

### 2. **📋 Каталог (CatalogTab)**
- ✅ Загрузка всех залов: `GET /api/halls`
- ✅ Сортировка: по названию, цене (возрастание/убывание)
- ✅ Фильтрация: по максимальной цене
- ✅ Добавление в корзину с указанием даты/времени
- ✅ Функционал избранного: `GET/POST /api/favorites`
- ✅ Кнопка сердца для добавления в избранное (требует авторизации)

**API запросы:**
```javascript
// Добавить в избранное
POST /api/favorites
Headers: { Authorization: "Bearer {token}" }
Body: { hall_id: number, photographer_id: null }

// Получить избранное
GET /api/favorites
Headers: { Authorization: "Bearer {token}" }
```

---

### 3. **🔍 Поиск (SearchTab)**
- ✅ Клиентский поиск по названию и описанию залов
- ✅ Фильтрация по категориям
- ✅ Отображение результатов в реальном времени
- ✅ Загрузка всех залов при монтировании

**Как работает:**
1. При загрузке запрашиваются все залы: `GET /api/halls`
2. Поиск и фильтрация выполняются на клиенте
3. Результаты обновляются при вводе текста

---

### 4. **🛒 Корзина (CartTab)**
- ✅ Добавление/удаление товаров
- ✅ Изменение количества часов
- ✅ Расчет итоговой суммы
- ✅ Сохранение бронирований: `POST /api/booking` (требует авторизации)
- ✅ Показ красного бэйджа с количеством товаров

**Бронирование отправляется:**
```javascript
POST /api/booking
Headers: {
  'Content-Type': 'application/json',
  'Authorization': 'Bearer {token}'
}
Body: {
  clientId: number,      // из JWT токена
  hallId: number,
  startTime: ISO string,
  endTime: ISO string,
  totalCost: number,
  status: 'pending'
}
```

---

### 5. **👤 Профиль (ProfileTab)**
- ✅ Отображение данных пользователя из JWT
- ✅ Меню с функциями (в разработке)
- ✅ Выход из аккаунта (удаление токена)

**JWT структура:**
```javascript
{
  id: number,        // client_id
  firstName: string
}
```

---

### 6. **🏠 Главная (HomeTab)**
- ✅ Динамическое приветствие с именем пользователя
- ✅ Быстрые ссылки на разделы
- ✅ Промо-баннер со скидкой

---

## 📡 API Endpoints

| Метод | Endpoint | Требует Auth | Описание |
|-------|----------|---|----------|
| GET | `/api/halls` | ❌ | Получить все залы |
| GET | `/api/services` | ❌ | Получить все услуги |
| POST | `/api/login` | ❌ | Вход пользователя |
| POST | `/api/login/register` | ❌ | Регистрация |
| GET | `/api/favorites` | ✅ | Получить избранное пользователя |
| POST | `/api/favorites` | ✅ | Добавить в избранное |
| GET | `/api/booking` | ❌ | Получить все бронирования |
| POST | `/api/booking` | ✅ | Создать бронирование |
| PATCH | `/api/booking/:id` | ✅ | Обновить бронирование |
| DELETE | `/api/booking/:id` | ✅ | Удалить бронирование |

---

## 🔑 Важные детали

### JWT Token
- Сохраняется в `localStorage.jwt_token`
- Используется як `Bearer ${token}` в headers
- Содержит `id` (client_id) и `firstName`
- Может быть декодирован на клиенте: `token.split('.')[1]` → `atob()` → `JSON.parse()`

### Обработка ошибок
- При 401 (неавторизован): предложить вход
- При 500 (ошибка сервера): показать сообщение об ошибке
- Все ошибки логируются в console

### Загрузка изображений
- Путь к изображениям: `/HallsImages/${studio.imageURL}`
- Базовый URL: `http://localhost:3000`
- Fallback при ошибке загрузки: placeholder из `via.placeholder.com`

---

## 🚀 Как запустить

### Frontend:
```bash
cd Site
npm install
npm run dev
```

### Backend:
```bash
cd Api
npm install
node app.js
```

Backend запустится на `http://localhost:3000`
Frontend на `http://localhost:5173` (Vite)

---

## 📝 Примечания

1. **Поиск** - работает только с загруженными на клиента залами
2. **Избранное** - требует авторизации и JWT токена
3. **Бронирование** - автоматически создаёт start_time и end_time на основе количества часов
4. **Корзина** - сохраняется в памяти браузера (обнуляется при перезагрузке)

---

## 🎯 Возможные улучшения

- [ ] Локальное хранилище для корзины (localStorage/IndexedDB)
- [ ] История просмотра залов
- [ ] Фильтрация по категориям на сервере
- [ ] Система рейтинга и отзывов
- [ ] Расширенный поиск с фильтрами
- [ ] Уведомления о статусе бронирования
