Fix issues

This commit is contained in:
Urtzi Alfaro
2025-07-18 11:51:43 +02:00
parent 9391368b83
commit 592a810762
35 changed files with 3806 additions and 122 deletions

View File

@@ -0,0 +1,90 @@
# ================================================================
# services/data/app/services/traffic_service.py
# ================================================================
"""Traffic data service"""
from typing import List, Dict, Any, Optional
from datetime import datetime, timedelta
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, and_
import structlog
from app.models.traffic import TrafficData
from app.external.madrid_opendata import MadridOpenDataClient
from app.schemas.external import TrafficDataResponse
logger = structlog.get_logger()
class TrafficService:
def __init__(self):
self.madrid_client = MadridOpenDataClient()
async def get_current_traffic(self, latitude: float, longitude: float) -> Optional[TrafficDataResponse]:
"""Get current traffic data for location"""
try:
traffic_data = await self.madrid_client.get_current_traffic(latitude, longitude)
if traffic_data:
return TrafficDataResponse(**traffic_data)
return None
except Exception as e:
logger.error("Failed to get current traffic", error=str(e))
return None
async def get_historical_traffic(self,
latitude: float,
longitude: float,
start_date: datetime,
end_date: datetime,
db: AsyncSession) -> List[TrafficDataResponse]:
"""Get historical traffic data"""
try:
# Check database first
location_id = f"{latitude:.4f},{longitude:.4f}"
stmt = select(TrafficData).where(
and_(
TrafficData.location_id == location_id,
TrafficData.date >= start_date,
TrafficData.date <= end_date
)
).order_by(TrafficData.date)
result = await db.execute(stmt)
db_records = result.scalars().all()
if db_records:
return [TrafficDataResponse(
date=record.date,
traffic_volume=record.traffic_volume,
pedestrian_count=record.pedestrian_count,
congestion_level=record.congestion_level,
average_speed=record.average_speed,
source=record.source
) for record in db_records]
# Fetch from API if not in database
traffic_data = await self.madrid_client.get_historical_traffic(
latitude, longitude, start_date, end_date
)
# Store in database
for data in traffic_data:
traffic_record = TrafficData(
location_id=location_id,
date=data['date'],
traffic_volume=data.get('traffic_volume'),
pedestrian_count=data.get('pedestrian_count'),
congestion_level=data.get('congestion_level'),
average_speed=data.get('average_speed'),
source="madrid_opendata",
raw_data=str(data)
)
db.add(traffic_record)
await db.commit()
return [TrafficDataResponse(**item) for item in traffic_data]
except Exception as e:
logger.error("Failed to get historical traffic", error=str(e))
return []