|
|
@@ -7,7 +7,7 @@
|
|
|
|
|
|
## Аутентификация
|
|
|
- **Access Token**: JWT, срок 15 мин, в заголовке `Authorization: Bearer <token>`
|
|
|
-- **Refresh Token**: HTTP-only cookie, срок 30 дней, ротация при использовании
|
|
|
+- **Refresh Token**: JWT, срок 30 дней, передаётся в заголовке `X-Refresh-Token`
|
|
|
- **Роли**: `superadmin`, `moderator`, `landlord`, `executor`, `customer`
|
|
|
|
|
|
## Формат ошибок (RFC 7807)
|
|
|
@@ -34,14 +34,15 @@
|
|
|
{
|
|
|
"email": "user@example.com",
|
|
|
"password": "securePass123",
|
|
|
- "role": "customer" // customer | landlord | executor
|
|
|
+ "role": "customer", // customer | landlord | executor
|
|
|
+ "name": "Иван Иванов"
|
|
|
}
|
|
|
|
|
|
// Ответ 201
|
|
|
{
|
|
|
"user": { "id": "uuid", "email": "...", "role": "customer", "created_at": "..." },
|
|
|
"access_token": "eyJ...",
|
|
|
- "refresh_token": "eyJ..." // также устанавливается HttpOnly cookie
|
|
|
+ "refresh_token": "eyJ..."
|
|
|
}
|
|
|
```
|
|
|
|
|
|
@@ -62,11 +63,11 @@
|
|
|
```
|
|
|
|
|
|
### POST /auth/refresh
|
|
|
-- На основе cookie, тело не требуется
|
|
|
+- Заголовок: `X-Refresh-Token: <refresh_token>`
|
|
|
- Ответ 200: новый access_token + обновлённый refresh_token
|
|
|
|
|
|
### POST /auth/logout
|
|
|
-- Инвалидирует refresh token
|
|
|
+- Заголовок: `Authorization: Bearer <access_token>`
|
|
|
- Ответ 204
|
|
|
|
|
|
### GET /auth/me
|
|
|
@@ -174,8 +175,9 @@
|
|
|
- Редактирование владельцем переводит в статус `pending_moderation`
|
|
|
|
|
|
### DELETE /places/:id
|
|
|
-**Роли:** Владелец, `moderator`, `superadmin`
|
|
|
-- Мягкое удаление
|
|
|
+**Роли:** Владелец (свои места), `moderator`, `superadmin`
|
|
|
+- Проверка: `owner_id` == текущий пользователь || moderator || superadmin
|
|
|
+- Мягкое удаление (`deleted_at`)
|
|
|
|
|
|
### POST /places/:id/moderate
|
|
|
**Роли:** `moderator`, `superadmin`
|
|
|
@@ -210,10 +212,12 @@
|
|
|
```
|
|
|
|
|
|
### PATCH /services/:id
|
|
|
-**Роль:** Владелец, `moderator`, `superadmin`
|
|
|
+**Роль:** Владелец (свои услуги), `moderator`, `superadmin`
|
|
|
+- Проверка: `executor_id` == текущий пользователь || moderator || superadmin
|
|
|
|
|
|
### DELETE /services/:id
|
|
|
-**Роль:** Владелец, `moderator`, `superadmin`
|
|
|
+**Роль:** Владелец (свои услуги), `moderator`, `superadmin`
|
|
|
+- Проверка: `executor_id` == текущий пользователь || moderator || superadmin
|
|
|
|
|
|
---
|
|
|
|
|
|
@@ -224,6 +228,15 @@
|
|
|
|
|
|
### PATCH /users/me
|
|
|
**Обновление своего профиля**
|
|
|
+```json
|
|
|
+{
|
|
|
+ "name": "Новое имя",
|
|
|
+ "phone": "+79991234567",
|
|
|
+ "bio": "Фотограф с 10-летним стажем",
|
|
|
+ "avatar_url": "https://cdn.../avatar.jpg",
|
|
|
+ "country": "RU"
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
### GET /users/me/places
|
|
|
**Свои места (все статусы)**
|
|
|
@@ -258,6 +271,45 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
+## Бронирования (Bookings)
|
|
|
+
|
|
|
+### POST /bookings
|
|
|
+**Роль:** Любой авторизованный пользователь
|
|
|
+```json
|
|
|
+{
|
|
|
+ "place_id": "uuid",
|
|
|
+ "start_time": "2024-02-01T10:00:00Z",
|
|
|
+ "end_time": "2024-02-01T14:00:00Z",
|
|
|
+ "comment": "Нужна циклорама"
|
|
|
+}
|
|
|
+```
|
|
|
+- Проверка доступности слота
|
|
|
+- Расчёт цены на основе `hourly_rate`
|
|
|
+
|
|
|
+### GET /bookings/me
|
|
|
+**Список своих бронирований**
|
|
|
+
|
|
|
+### PATCH /bookings/:id/cancel
|
|
|
+**Роль:** Владелец брони
|
|
|
+- Проверка: `user_id` == текущий пользователь
|
|
|
+
|
|
|
+### PATCH /bookings/:id/confirm
|
|
|
+**Роль:** `moderator`, `superadmin`
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## WebSocket — точки посетителей
|
|
|
+
|
|
|
+### GET /ws/visitors
|
|
|
+- WebSocket-соединение для получения точек других посетителей на карте
|
|
|
+- Клиент отправляет `{ "user_id": "...", "lat": 55.75, "lng": 37.61 }`
|
|
|
+- Сервер рассылает всем подключённым клиентам список всех активных точек:
|
|
|
+```json
|
|
|
+{ "visitors": [{ "user_id": "...", "lat": 55.75, "lng": 37.61 }] }
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
## Теги и характеристики (справочные данные)
|
|
|
|
|
|
### GET /tags
|