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);
|
||||
return httpServer;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user