161 lines
5.5 KiB
Markdown
161 lines
5.5 KiB
Markdown
|
|
# Настройка API для редактора карт
|
|||
|
|
|
|||
|
|
## Обзор
|
|||
|
|
|
|||
|
|
Добавлены новые API эндпоинты для работы с объектами городов в редакторе карт:
|
|||
|
|
|
|||
|
|
- `POST /api/save-object` - Сохранение/обновление объекта города
|
|||
|
|
- `DELETE /api/delete-object/:id` - Удаление объекта города
|
|||
|
|
|
|||
|
|
## Установка
|
|||
|
|
|
|||
|
|
### 1. Создание таблицы city_objects
|
|||
|
|
|
|||
|
|
Выполните миграцию для создания таблицы:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
node run-city-objects-migration.js
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. Проверка структуры БД
|
|||
|
|
|
|||
|
|
Убедитесь, что в базе данных существуют связанные таблицы:
|
|||
|
|
- `cities` - города
|
|||
|
|
- `organizations` - организации
|
|||
|
|
- `interiors` - интерьеры
|
|||
|
|
|
|||
|
|
### 3. Перезапуск сервера
|
|||
|
|
|
|||
|
|
После добавления новых API эндпоинтов перезапустите сервер:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
npm start
|
|||
|
|
# или
|
|||
|
|
node server.js
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## API Эндпоинты
|
|||
|
|
|
|||
|
|
### POST /api/save-object
|
|||
|
|
|
|||
|
|
Сохранение или обновление объекта города.
|
|||
|
|
|
|||
|
|
**Параметры запроса:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"id": 123, // ID объекта (для обновления) или null (для создания)
|
|||
|
|
"city_id": 1, // ID города (обязательно)
|
|||
|
|
"name": "Здание отеля", // Название объекта
|
|||
|
|
"model_url": "models/copied/building-hotel.glb", // URL модели (обязательно)
|
|||
|
|
"pos_x": 10.5, // X координата
|
|||
|
|
"pos_y": 0.0, // Y координата
|
|||
|
|
"pos_z": 15.2, // Z координата
|
|||
|
|
"rot_x": 0.0, // X поворот (радианы)
|
|||
|
|
"rot_y": 1.57, // Y поворот (радианы)
|
|||
|
|
"rot_z": 0.0, // Z поворот (радианы)
|
|||
|
|
"scale_x": 1.0, // X масштаб
|
|||
|
|
"scale_y": 1.0, // Y масштаб
|
|||
|
|
"scale_z": 1.0, // Z масштаб
|
|||
|
|
"organization_id": 2, // ID организации (по умолчанию 2)
|
|||
|
|
"rent": 0, // Аренда (по умолчанию 0)
|
|||
|
|
"tax": 0, // Налог (по умолчанию 0)
|
|||
|
|
"collidable": false, // Коллизия (по умолчанию false)
|
|||
|
|
"interior_id": 101, // ID интерьера (по умолчанию 101)
|
|||
|
|
"textures": "-" // Текстуры (по умолчанию "-")
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Ответ:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"id": 123,
|
|||
|
|
"success": true
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### DELETE /api/delete-object/:id
|
|||
|
|
|
|||
|
|
Удаление объекта города.
|
|||
|
|
|
|||
|
|
**Параметры:**
|
|||
|
|
- `id` - ID объекта для удаления
|
|||
|
|
|
|||
|
|
**Ответ:**
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"success": true,
|
|||
|
|
"message": "Объект удален"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Структура таблицы city_objects
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
CREATE TABLE city_objects (
|
|||
|
|
id SERIAL PRIMARY KEY,
|
|||
|
|
city_id INTEGER NOT NULL,
|
|||
|
|
name VARCHAR(255) NOT NULL DEFAULT '',
|
|||
|
|
model_url VARCHAR(500) NOT NULL,
|
|||
|
|
|
|||
|
|
-- Позиция
|
|||
|
|
pos_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
pos_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
pos_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
|
|||
|
|
-- Поворот (радианы)
|
|||
|
|
rot_x DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
rot_y DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
rot_z DECIMAL(15, 6) NOT NULL DEFAULT 0,
|
|||
|
|
|
|||
|
|
-- Масштаб
|
|||
|
|
scale_x DECIMAL(15, 6) NOT NULL DEFAULT 1,
|
|||
|
|
scale_y DECIMAL(15, 6) NOT NULL DEFAULT 1,
|
|||
|
|
scale_z DECIMAL(15, 6) NOT NULL DEFAULT 1,
|
|||
|
|
|
|||
|
|
-- Дополнительные свойства
|
|||
|
|
organization_id INTEGER NOT NULL DEFAULT 2,
|
|||
|
|
rent DECIMAL(10, 2) NOT NULL DEFAULT 0,
|
|||
|
|
tax DECIMAL(10, 2) NOT NULL DEFAULT 0,
|
|||
|
|
collidable BOOLEAN NOT NULL DEFAULT false,
|
|||
|
|
interior_id INTEGER NOT NULL DEFAULT 101,
|
|||
|
|
textures VARCHAR(500) NOT NULL DEFAULT '-',
|
|||
|
|
|
|||
|
|
-- Метаданные
|
|||
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|||
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Интеграция с редактором карт
|
|||
|
|
|
|||
|
|
Редактор карт теперь автоматически:
|
|||
|
|
|
|||
|
|
1. **Сохраняет объекты** при добавлении новых
|
|||
|
|
2. **Обновляет объекты** при изменении координат/свойств
|
|||
|
|
3. **Удаляет объекты** из БД при удалении
|
|||
|
|
4. **Загружает объекты** при смене города
|
|||
|
|
5. **Сохраняет ID** существующих объектов
|
|||
|
|
|
|||
|
|
## Безопасность
|
|||
|
|
|
|||
|
|
- Все эндпоинты требуют аутентификации (`authenticate` middleware)
|
|||
|
|
- Валидация входных данных
|
|||
|
|
- Обработка ошибок с логированием
|
|||
|
|
- SQL injection защита через параметризованные запросы
|
|||
|
|
|
|||
|
|
## Отладка
|
|||
|
|
|
|||
|
|
Для проверки работы API используйте:
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
# Проверка создания объекта
|
|||
|
|
curl -X POST http://localhost:3000/api/save-object \
|
|||
|
|
-H "Content-Type: application/json" \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|||
|
|
-d '{"city_id": 1, "model_url": "models/copied/building.glb", "name": "Тестовое здание"}'
|
|||
|
|
|
|||
|
|
# Проверка удаления объекта
|
|||
|
|
curl -X DELETE http://localhost:3000/api/delete-object/123 \
|
|||
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|||
|
|
```
|