From db860125fc6eeaf2455ef2e1698ec55a40cec6d2 Mon Sep 17 00:00:00 2001 From: marco370 <48531002-marco370@users.noreply.replit.com> Date: Thu, 23 Oct 2025 10:59:32 +0000 Subject: [PATCH] Add address lookup using OpenStreetMap data Integrate Nominatim API endpoint to geocode addresses with rate limiting and user-agent configuration. Replit-Commit-Author: Agent Replit-Commit-Session-Id: e5565357-90e1-419f-b9a8-6ee8394636df Replit-Commit-Checkpoint-Type: intermediate_checkpoint Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/e5565357-90e1-419f-b9a8-6ee8394636df/TFybNy5 --- server/routes.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/server/routes.ts b/server/routes.ts index aa072fd..f22a556 100644 --- a/server/routes.ts +++ b/server/routes.ts @@ -3303,6 +3303,68 @@ export async function registerRoutes(app: Express): Promise { } }); + // ============= GEOCODING API (Nominatim/OSM) ============= + + // Rate limiter semplice per rispettare 1 req/sec di Nominatim + let lastGeocodingRequest = 0; + + app.post("/api/geocode", isAuthenticated, async (req: any, res) => { + try { + const { address } = req.body; + + if (!address || typeof address !== 'string') { + return res.status(400).json({ message: "Address parameter required" }); + } + + // Rispetta rate limit di 1 req/sec + const now = Date.now(); + const timeSinceLastRequest = now - lastGeocodingRequest; + if (timeSinceLastRequest < 1000) { + const waitTime = 1000 - timeSinceLastRequest; + await new Promise(resolve => setTimeout(resolve, waitTime)); + } + lastGeocodingRequest = Date.now(); + + // Chiama Nominatim API + const nominatimUrl = new URL("https://nominatim.openstreetmap.org/search"); + nominatimUrl.searchParams.set("q", address); + nominatimUrl.searchParams.set("format", "json"); + nominatimUrl.searchParams.set("limit", "1"); + nominatimUrl.searchParams.set("addressdetails", "1"); + + const response = await fetch(nominatimUrl.toString(), { + headers: { + "User-Agent": "VigilanzaTurni/1.0 (Security Shift Management System)", + }, + }); + + if (!response.ok) { + throw new Error(`Nominatim API error: ${response.status}`); + } + + const data = await response.json(); + + if (!data || data.length === 0) { + return res.status(404).json({ + message: "Indirizzo non trovato. Prova a essere più specifico (es. Via, Città, Italia)" + }); + } + + const result = data[0]; + + res.json({ + latitude: result.lat, + longitude: result.lon, + displayName: result.display_name, + address: result.address, + }); + + } catch (error) { + console.error("Error geocoding address:", error); + res.status(500).json({ message: "Errore durante la geocodifica dell'indirizzo" }); + } + }); + const httpServer = createServer(app); return httpServer; }