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
This commit is contained in:
marco370 2025-10-23 10:59:32 +00:00
parent 66dc97855e
commit db860125fc

View File

@ -3303,6 +3303,68 @@ export async function registerRoutes(app: Express): Promise<Server> {
} }
}); });
// ============= 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); const httpServer = createServer(app);
return httpServer; return httpServer;
} }