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