Files
DLE/backend/routes/geocoding.js
2025-10-30 22:41:04 +03:00

113 lines
4.9 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* Copyright (c) 2024-2025 Тарабанов Александр Викторович
* All rights reserved.
*
* This software is proprietary and confidential.
* Unauthorized copying, modification, or distribution is prohibited.
*
* For licensing inquiries: info@hb3-accelerator.com
* Website: https://hb3-accelerator.com
* GitHub: https://github.com/VC-HB3-Accelerator
*/
// backend/routes/geocoding.js
const express = require('express');
const router = express.Router();
const axios = require('axios'); // Убедитесь, что axios установлен на бэкенде
const logger = require('../utils/logger'); // Если используете логгер
/**
* @swagger
* tags:
* name: Geocoding
* description: Прокси для сервисов геокодирования (например, Nominatim)
*/
/**
* @swagger
* /api/geocoding/nominatim-search:
* get:
* summary: Проксирует запрос к Nominatim API (search)
* tags: [Geocoding]
* description: Перенаправляет GET запрос со всеми его query параметрами к https://nominatim.openstreetmap.org/search. Это необходимо для обхода CORS ограничений в браузере.
* parameters:
* - in: query
* name: q
* schema:
* type: string
* required: true
* description: Строка адреса для поиска.
* - in: query
* name: format
* schema:
* type: string
* required: true
* description: Формат ответа (например, jsonv2).
* - in: query
* name: addressdetails
* schema:
* type: integer
* enum: [0, 1]
* description: Включить детализированный адрес (0 или 1).
* - in: query
* name: limit
* schema:
* type: integer
* description: Максимальное количество возвращаемых результатов.
* # Можно добавить сюда и другие параметры Nominatim API по мере необходимости
* responses:
* 200:
* description: Успешный ответ от Nominatim.
* content:
* application/json:
* schema:
* type: object # Или array, в зависимости от ответа Nominatim
* 500:
* description: Ошибка при запросе к Nominatim или внутренняя ошибка сервера.
*/
router.get('/nominatim-search', async (req, res) => {
try {
// Формируем URL для Nominatim, используя все query параметры из исходного запроса
const queryParams = new URLSearchParams(req.query);
const nominatimUrl = `https://nominatim.openstreetmap.org/search?${queryParams.toString()}`;
if (logger && typeof logger.info === 'function') {
logger.info(`[Geocoding] Proxying request to Nominatim: ${nominatimUrl}`);
} else {
console.log(`[Geocoding] Proxying request to Nominatim: ${nominatimUrl}`);
}
const nominatimResponse = await axios.get(nominatimUrl);
res.json(nominatimResponse.data);
} catch (error) {
let errorMessage = error.message;
let errorStatus = 500;
let errorDetails = null;
if (error.response) {
// Ошибка пришла от Nominatim (или сети)
errorMessage = error.response.data?.message || error.response.statusText || 'Error fetching data from Nominatim';
errorStatus = error.response.status || 500;
errorDetails = error.response.data;
} else if (error.request) {
// Запрос был сделан, но ответ не получен
errorMessage = 'No response received from Nominatim';
}
// Иначе это ошибка настройки axios или другая внутренняя ошибка
if (logger && typeof logger.error === 'function') {
logger.error(`[Geocoding] Error proxying to Nominatim: ${errorMessage}`, { status: errorStatus, details: errorDetails, query: req.query });
} else {
console.error(`[Geocoding] Error proxying to Nominatim: ${errorMessage}`, { status: errorStatus, details: errorDetails, query: req.query });
}
res.status(errorStatus).json({
message: 'Error processing geocoding request',
details: errorDetails || errorMessage
});
}
});
module.exports = router;