Spaces:
Sleeping
Routing Guide
Application Routes
Main Routes
| Route | Description | Features |
|---|---|---|
/ |
Home page with interactive map | View all sensors, click for overlay dashboard |
/sensor/[sensorId] |
Individual sensor detail page | Full dashboard, current readings, mini map |
Examples
http://localhost:3000/ # Map view
http://localhost:3000/sensor/SENSOR_NYC_001 # NYC sensor
http://localhost:3000/sensor/SENSOR_LON_001 # London sensor
http://localhost:3000/sensor/SENSOR_TKY_001 # Tokyo sensor
Navigation Flow
From Map to Sensor Detail
User Flow:
1. Visit homepage (/)
2. Click sensor marker on map
3. Side panel opens with quick dashboard
4. Click "Open Full Dashboard" button
5. Navigate to /sensor/[sensorId]
Direct Access
Users can directly access any sensor page:
http://localhost:3000/sensor/SENSOR_NYC_001
This is useful for:
- Bookmarking favorite sensors
- Sharing specific sensor data
- Direct links in reports or emails
- Deep linking from other applications
Return to Map
On any sensor detail page:
- Click the back arrow (β) in the header
- Returns to the map view
URL Structure
Sensor ID Pattern
Sensor IDs follow this format: SENSOR_[LOCATION]_[NUMBER]
Examples:
SENSOR_NYC_001- New York City, sensor #1SENSOR_LON_001- London, sensor #1SENSOR_TKY_001- Tokyo, sensor #1
Query Parameters
Currently not used, but can be added for:
- Time range:
?range=1w - Metric focus:
?metric=pH - Date filters:
?start=2024-01-01&end=2024-01-31
API Routes
Get All Sensors
GET /api/sensors
Returns all sensors with their latest readings.
Response:
[
{
"sensorId": "SENSOR_NYC_001",
"latitude": 40.7128,
"longitude": -74.0060,
"locationName": "New York City, USA",
"installedAt": "2020-01-15T00:00:00.000Z",
"latestReading": {
"pH": 7.2,
"turbidity": 3.5,
"temperature": 22.1,
"hardness": 150.0,
"timestamp": "2024-02-16T10:30:00.000Z"
}
}
]
Get Sensor Readings
GET /api/readings?sensorId=SENSOR_NYC_001&timeRange=1d
Query Parameters:
sensorId(required): Sensor identifiertimeRange:1h,1d,1w,1m(default:1d)startDate: ISO date string (for custom range)endDate: ISO date string (for custom range)
Response:
[
{
"sensorId": "SENSOR_NYC_001",
"timestamp": "2024-02-16T10:30:00.000Z",
"pH": 7.2,
"turbidity": 3.5,
"temperature": 22.1,
"hardness": 150.0
}
]
Route Generation
Static Routes
/- Always available/api/sensors- API endpoint/api/readings- API endpoint
Dynamic Routes
/sensor/[sensorId]- Generated for each sensor in database
404 Handling
If a sensor doesn't exist:
http://localhost:3000/sensor/INVALID_SENSOR
Shows a custom 404 page with:
- "Sensor Not Found" message
- Link back to map view
Programmatic Navigation
Using Next.js Link Component
import Link from 'next/link';
<Link href={`/sensor/${sensorId}`}>
View Sensor
</Link>
Using useRouter Hook
import { useRouter } from 'next/navigation';
const router = useRouter();
router.push(`/sensor/${sensorId}`);
Using Browser API
window.location.href = `/sensor/${sensorId}`;
SEO & Metadata
Each sensor page has dynamic metadata:
// Generates:
<title>New York City, USA - Water Quality Monitor</title>
<meta name="description" content="View real-time water quality data..." />
This improves:
- Search engine indexing
- Social media sharing
- Browser tab titles
- Bookmark descriptions
Deployment Considerations
Environment Variables
For production, set:
NEXT_PUBLIC_BASE_URL=https://your-domain.com
This ensures API calls work correctly when fetching sensor data.
Vercel Deployment
Routes work automatically. Dynamic routes are:
- Pre-rendered at build time (if using Static Generation)
- Or rendered on-demand (Server-Side Rendering)
Custom Domain
If deploying to custom domain:
https://water-quality.example.com/
https://water-quality.example.com/sensor/SENSOR_NYC_001
Mobile Considerations
All routes are:
- β Fully responsive
- β Touch-friendly
- β Mobile-optimized
- β Work with mobile browsers
Future Enhancements
Potential New Routes
Sensor Comparison
/compare?sensors=SENSOR_NYC_001,SENSOR_LON_001Analytics Dashboard
/analyticsAdmin Panel
/admin/sensors /admin/readingsExport/Reports
/sensor/SENSOR_NYC_001/export /reportsUser Authentication
/login /dashboard /profile
Query Parameter Options
Future query parameters for sensor pages:
/sensor/SENSOR_NYC_001?range=1w # Time range
/sensor/SENSOR_NYC_001?metric=pH # Focus on specific metric
/sensor/SENSOR_NYC_001?compare=true # Compare with other sensors
/sensor/SENSOR_NYC_001?export=csv # Export data
Testing Routes
Development
npm run dev
# Test routes:
open http://localhost:3000
open http://localhost:3000/sensor/SENSOR_NYC_001
Production Build
npm run build
npm start
# All routes should work identically
Using curl
# Test API
curl http://localhost:3000/api/sensors | jq
# Test specific sensor API
curl "http://localhost:3000/api/readings?sensorId=SENSOR_NYC_001&timeRange=1d" | jq
Quick Reference
Map View: /
Sensor Detail: /sensor/[sensorId]
Sensors API: /api/sensors
Readings API: /api/readings?sensorId=XXX
All routes are fast, SEO-friendly, and mobile-responsive! π