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:
parent
66dc97855e
commit
db860125fc
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user