# Sea Battle — Main Server API Базовый URL: `http://localhost:3000` Все эндпоинты (кроме регистрации и входа) требуют заголовок: ``` Authorization: Bearer ``` --- ## Аутентификация ### POST /api/register Регистрация нового пользователя. **Запрос** (`multipart/form-data` или `application/json`): | Поле | Тип | Обязательное | Описание | |------|-----|--------------|----------| | `user[nickname]` | string | ✅ | 3–24 символа, уникальный | | `user[password]` | string | ✅ | минимум 6 символов | | `user[avatar]` | file | — | PNG, JPEG, GIF или WebP | **Пример (curl):** ```bash curl -X POST http://localhost:3000/api/register \ -F "user[nickname]=CaptainNemo" \ -F "user[password]=secret123" \ -F "user[avatar]=@avatar.png" ``` **Ответ `201 Created`:** ```json { "user": { "id": 1, "nickname": "CaptainNemo", "avatar_url": "http://localhost:3000/rails/active_storage/blobs/...", "created_at": "2025-09-20T18:00:00.000Z" }, "token": "eyJhbGciOiJIUzI1NiJ9..." } ``` **Ошибки:** - `422 Unprocessable Entity` — невалидные данные: ```json { "errors": ["Nickname has already been taken"] } ``` ```json { "errors": ["Nickname is too short (minimum is 3 characters)"] } ``` --- ### POST /api/login Вход по никнейму и паролю. **Запрос** (`application/json`): ```json { "nickname": "CaptainNemo", "password": "secret123" } ``` **Ответ `200 OK`:** ```json { "user": { "id": 1, "nickname": "CaptainNemo", "avatar_url": "http://localhost:3000/rails/active_storage/blobs/...", "created_at": "2025-09-20T18:00:00.000Z" }, "token": "eyJhbGciOiJIUzI1NiJ9..." } ``` **Ошибки:** - `401 Unauthorized`: ```json { "error": "Invalid nickname or password" } ``` --- ### DELETE /api/logout Выход. JWT является stateless — клиент должен удалить токен на своей стороне. **Ответ `200 OK`:** ```json { "message": "Signed out successfully" } ``` --- ### GET /api/me Информация о текущем аутентифицированном пользователе. **Ответ `200 OK`:** ```json { "user": { "id": 1, "nickname": "CaptainNemo", "avatar_url": "http://localhost:3000/rails/active_storage/blobs/...", "created_at": "2025-09-20T18:00:00.000Z" } } ``` **Ошибки:** - `401 Unauthorized`: ```json { "error": "Unauthorized" } ``` --- ## Системные эндпоинты ### GET /up Health check для мониторинга и load balancers. **Ответ `200 OK`:** ```html ``` --- ## Коды ошибок | Код | Описание | |-----|----------| | `200` | Успех | | `201` | Ресурс создан | | `401` | Не авторизован (отсутствует/невалиден токен, неверный пароль) | | `422` | Ошибка валидации | ## Валидации | Поле | Правила | |------|---------| | `nickname` | 3–24 символа, уникальный (регистронезависимо) | | `password` | минимум 6 символов | | `avatar` | PNG, JPEG, GIF, WebP; опциональный | ## CORS Настроен через `config/initializers/cors.rb`. По умолчанию разрешены все origins (`*`). Для production задайте переменную окружения: ```bash CORS_ORIGINS=https://your-frontend.com,https://www.your-frontend.com ``` ## JWT - Алгоритм: `HS256` - Срок жизни: **7 дней** - Секретный ключ: `Rails.application.secret_key_base` - Payload: `{ "user_id": 1, "exp": 1234567890 }`