# Настройка 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"
```
