# ROBO-OPS — личный кабинет оператора робота

Веб-приложение для управления роботами и ведения профиля оператора.  
Стек: **Python, FastAPI, SQLite, HTML, CSS, JavaScript**.

---

## Запуск приложения

**Единственный способ запуска — скрипт `start.sh`.**

Другие команды (`python run.py`, `uvicorn`, `python -m http.server` и т.п.) **не поддерживаются** — приложение откажется стартовать без переменной окружения, которую выставляет только `start.sh`.

### Требования

- Python 3.10 или новее
- Bash (Linux, macOS, Git Bash или WSL на Windows)

### Первый запуск

```bash
cd путь/к/ПРАКТИКА
chmod +x start.sh    # один раз, если скрипт не исполняемый
./start.sh
```

### Что делает `start.sh`

1. Определяет каталог проекта
2. Создаёт виртуальное окружение `.venv` (если его нет) и устанавливает зависимости из `requirements.txt`
3. Создаёт папку `data/` и файл базы SQLite (если их нет)
4. Запускает сервер FastAPI на порту **8000**

> **Для проверяющего:** в архив сдаётся только исходный код (16 файлов). Папки `.venv`, `data/` и `__pycache__/` **не нужны** — они создаются автоматически при первом запуске `./start.sh`.

### После запуска

| Адрес | Назначение |
|-------|------------|
| http://localhost:8000 | Главная (панель роботов) |
| http://localhost:8000/register | Регистрация |
| http://localhost:8000/login | Вход |
| http://localhost:8000/docs | Документация API (Swagger) |

Остановка сервера: **Ctrl+C** в терминале.

### Переменные окружения (необязательно)

| Переменная | По умолчанию | Описание |
|------------|--------------|----------|
| `PORT` | `8000` | Порт сервера |
| `EXTERNAL_API_KEY` | `robo-ops-external-demo-key-2026` | Ключ для внешнего API |
| `DATABASE_PATH` | `./data/robo_ops.db` | Путь к файлу БД |

Пример:

```bash
PORT=9000 ./start.sh
```

---

## Принцип работы приложения

### Общая схема

```
Браузер (HTML/CSS/JS)
        │
        ▼  HTTP + cookie-сессия
   FastAPI (app/main.py)
        │
        ▼
   SQLite (data/robo_ops.db)
        ▲
        │  X-API-Key
   Внешние приложения
```

Фронтенд — статические страницы в папке `static/`.  
Бэкенд — REST API на FastAPI.  
Данные хранятся в SQLite.

### Регистрация и авторизация

1. Пользователь регистрируется на `/register` (email + пароль от 6 символов).
2. Пароль хешируется через **bcrypt** и сохраняется в таблице `users`.
3. При регистрации или входе создаётся **сессия** в таблице `sessions`.
4. В браузер отправляется HttpOnly-cookie `robo_ops_session` (срок — 24 часа).
5. Токен сессии в БД хранится в виде SHA-256 хеша, не в открытом виде.

Без активной сессии доступ к главной странице и API закрыт — браузер перенаправляется на `/login`.

### Личный кабинет

В профиле оператора хранятся и редактируются:

- электронная почта (только чтение после регистрации)
- имя, фамилия, отчество
- возраст
- номер телефона
- **рейтинг** и **баллы** (обновляются также через внешнее API)

На странице профиля отображаются **активные сессии** текущего пользователя.

### Панель управления роботами

У каждого пользователя — свой набор из 4 роботов (настройки в таблице `robot_settings`).

При изменении параметров (режим, скорость, чувствительность, аварийная остановка, ночной режим):

- пересчитываются характеристики робота (скорость, температура, статус, датчики);
- данные сохраняются в SQLite через API;
- при переходе между страницами настройки не теряются.

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

| Мера | Реализация |
|------|------------|
| Пароли | bcrypt-хеширование |
| Сессии | HttpOnly cookie, хеш токена в БД, срок жизни 24 ч |
| Внешний API | Заголовок `X-API-Key` |
| Валидация | Pydantic-схемы для всех входных данных |
| SQL | Параметризованные запросы |

---

## API

### Для веб-приложения (нужна cookie-сессия)

| Метод | Путь | Описание |
|-------|------|----------|
| POST | `/api/auth/register` | Регистрация |
| POST | `/api/auth/login` | Вход |
| POST | `/api/auth/logout` | Выход |
| GET | `/api/auth/me` | Текущий пользователь |
| GET/PUT | `/api/profile` | Профиль |
| GET | `/api/sessions` | Активные сессии |
| GET/PUT | `/api/robots` | Настройки роботов |

### Для внешних приложений (заголовок `X-API-Key`)

| Метод | Путь | Описание |
|-------|------|----------|
| GET | `/api/external/users` | Список пользователей |
| GET | `/api/external/users/{id}` | Пользователь по ID |
| GET | `/api/external/users/by-email/{email}` | Пользователь по email |
| GET | `/api/external/sessions` | Активные сессии |
| POST | `/api/external/data` | Запись данных |
| GET | `/api/external/data` | Чтение записей |

Пример записи баллов из внешней системы:

```bash
curl -X POST http://localhost:8000/api/external/data \
  -H "X-API-Key: robo-ops-external-demo-key-2026" \
  -H "Content-Type: application/json" \
  -d '{
    "user_id": 1,
    "source_app": "mission-tracker",
    "data_key": "mission_complete",
    "data_value": {"points": 50, "rating": 4.5}
  }'
```

Поля `points` и `rating` в `data_value` автоматически обновляют профиль пользователя.

---

## Структура проекта

```
ПРАКТИКА/
├── start.sh              ← единственная точка запуска
├── README.md             ← эта инструкция
├── requirements.txt      ← зависимости Python
├── app/
│   ├── __init__.py
│   ├── main.py           ← FastAPI, маршруты, API
│   ├── database.py       ← SQLite, модели данных
│   ├── security.py       ← bcrypt, токены сессий
│   ├── schemas.py        ← валидация запросов
│   └── config.py         ← настройки
└── static/
    ├── index.html        ← главная страница
    ├── login.html        ← вход
    ├── register.html     ← регистрация
    ├── css/styles.css    ← стили
    └── js/               ← api.js, app.js, auth.js
```

После первого запуска `./start.sh` рядом появятся служебные каталоги (их не нужно сдавать):

- `.venv/` — виртуальное окружение Python
- `data/` — файл базы `robo_ops.db`

---

## Типичные проблемы

**«Приложение запускается только через ./start.sh»**  
Вы запустили сервер в обход скрипта. Используйте `./start.sh`.

**На Windows не работает `./start.sh`**  
Запускайте через **Git Bash** или **WSL**, не через обычный PowerShell.

**Порт 8000 занят**  
```bash
PORT=9000 ./start.sh
```

**Нет Python**  
Установите Python 3.10+ с https://python.org и повторите `./start.sh`.

**Перед отправкой архива**  
Не включайте папки `.venv`, `data/` и `__pycache__/`. Если `.venv` не удаляется (файлы заняты процессом Python), закройте терминалы и IDE, затем удалите папку вручную.
