Files
line-of-sight/backend/app/server.js
T
Agent Zero b40116b56f Initial commit: MVP scaffolding for Line of Sight application
- React frontend with MapLibre integration
- Node.js Express backend with dummy API
- Docker containerization (PostgreSQL+PostGIS, backend, frontend)
- Interactive map with direction selector
- 20 mock conurbations data
- Full project structure ready for PR workflow
2026-03-16 15:27:35 +00:00

74 lines
3.5 KiB
JavaScript

const express = require('express');
const cors = require('cors');
require('dotenv').config();
const app = express();
const PORT = process.env.PORT || 3001;
app.use(cors());
app.use(express.json());
// Mock conurbation data for MVP
const MOCK_CONURBATIONS = [
{ id: 1, name: "London", population: 9000000, distance_km: 0, lat: 51.5074, lon: -0.1278 },
{ id: 2, name: "Paris", population: 2161000, distance_km: 344, lat: 48.8566, lon: 2.3522 },
{ id: 3, name: "Berlin", population: 3644000, distance_km: 878, lat: 52.5200, lon: 13.4050 },
{ id: 4, name: "Warsaw", population: 1793000, distance_km: 1200, lat: 52.2297, lon: 21.0122 },
{ id: 5, name: "Moscow", population: 12506000, distance_km: 2063, lat: 55.7558, lon: 37.6173 },
{ id: 6, name: "Kazan", population: 1257000, distance_km: 2850, lat: 55.7897, lon: 49.1219 },
{ id: 7, name: "Almaty", population: 2000000, distance_km: 3900, lat: 43.2220, lon: 76.8512 },
{ id: 8, name: "Urumqi", population: 3500000, distance_km: 4500, lat: 43.8256, lon: 87.6168 },
{ id: 9, name: "Lahore", population: 11126000, distance_km: 5400, lat: 31.5204, lon: 74.3587 },
{ id: 10, name: "New Delhi", population: 29399000, distance_km: 5800, lat: 28.6139, lon: 77.2090 },
{ id: 11, name: "Dhaka", population: 21006000, distance_km: 6200, lat: 23.8103, lon: 90.4125 },
{ id: 12, name: "Chennai", population: 10971000, distance_km: 6500, lat: 13.0827, lon: 80.2707 },
{ id: 13, name: "Bangkok", population: 10539000, distance_km: 7200, lat: 13.7563, lon: 100.5018 },
{ id: 14, name: "Jakarta", population: 10562000, distance_km: 8100, lat: -6.2088, lon: 106.8456 },
{ id: 15, name: "Singapore", population: 5686000, distance_km: 8300, lat: 1.3521, lon: 103.8198 },
{ id: 16, name: "Manila", population: 17801000, distance_km: 8700, lat: 14.5995, lon: 120.9842 },
{ id: 17, name: "Tokyo", population: 37400000, distance_km: 9500, lat: 35.6762, lon: 139.6503 },
{ id: 18, name: "Seoul", population: 9720000, distance_km: 9200, lat: 37.5665, lon: 126.9780 },
{ id: 19, name: "Beijing", population: 21540000, distance_km: 8900, lat: 39.9042, lon: 116.4074 },
{ id: 20, name: "Shanghai", population: 27058000, distance_km: 9000, lat: 31.2304, lon: 121.4737 }
];
// Mock API endpoint - returns dummy conurbations based on input coordinates
app.get('/api/line-of-sight', (req, res) => {
const { lat, lon, direction, tolerance } = req.query;
console.log(`Received request: lat=${lat}, lon=${lon}, direction=${direction}, tolerance=${tolerance}`);
// Return mock data for MVP
res.json({
success: true,
data: {
start_point: { lat: parseFloat(lat) || 51.5074, lon: parseFloat(lon) || -0.1278 },
direction: parseInt(direction) || 45,
tolerance_km: parseInt(tolerance) || 50,
conurbations: MOCK_CONURBATIONS.slice(0, 20),
line_coordinates: [
{ lat: 51.5074, lon: -0.1278 },
{ lat: 48.8566, lon: 2.3522 },
{ lat: 52.5200, lon: 13.4050 },
{ lat: 55.7558, lon: 37.6173 },
{ lat: 43.2220, lon: 76.8512 },
{ lat: 28.6139, lon: 77.2090 },
{ lat: 13.7563, lon: 100.5018 },
{ lat: -6.2088, lon: 106.8456 },
{ lat: 35.6762, lon: 139.6503 },
{ lat: 51.5074, lon: -0.1278 } // Complete the circle
]
},
message: "Mock data returned for MVP - Real geospatial calculations coming soon"
});
});
// Health check endpoint
app.get('/api/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`Line of Sight Backend running on port ${PORT}`);
});