84 lines
2.2 KiB
Python
84 lines
2.2 KiB
Python
from fastapi import APIRouter, Depends, HTTPException
|
|
from sqlalchemy.orm import Session
|
|
from datetime import datetime
|
|
|
|
from ..models import Base # Ensure models are loaded if needed
|
|
from ..services.postgresql_manager import PostgreSQLManager
|
|
from ..utils.config import config
|
|
|
|
from ..services.discovery import SegmentDiscoveryService
|
|
from ..schemas.discovery import DiscoveryFilter, DiscoveryResult, CandidateSegmentSchema, SingleDiscoveryRequest
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
def get_db_session():
|
|
db_manager = PostgreSQLManager(config.DATABASE_URL)
|
|
with db_manager.get_db_session() as session:
|
|
yield session
|
|
|
|
|
|
@router.post("/segments", response_model=DiscoveryResult)
|
|
def discover_segments(
|
|
filter: DiscoveryFilter,
|
|
db: Session = Depends(get_db_session)
|
|
):
|
|
service = SegmentDiscoveryService(db)
|
|
|
|
|
|
# Defaults
|
|
start = filter.start_date or datetime.now().replace(year=datetime.now().year - 1) # Default 1 year?
|
|
|
|
candidates, debug_paths = service.discover_segments(
|
|
activity_type=filter.activity_type,
|
|
start_date=start,
|
|
end_date=filter.end_date
|
|
)
|
|
|
|
|
|
# Convert to schema
|
|
results = []
|
|
for c in candidates:
|
|
results.append(CandidateSegmentSchema(
|
|
points=c.points,
|
|
frequency=c.frequency,
|
|
distance=c.distance,
|
|
activity_ids=c.activity_ids
|
|
))
|
|
|
|
return DiscoveryResult(
|
|
candidates=results,
|
|
generated_at=datetime.now(),
|
|
activity_count=len(debug_paths),
|
|
debug_paths=debug_paths
|
|
)
|
|
|
|
|
|
@router.post("/single", response_model=DiscoveryResult)
|
|
def discover_single_activity(
|
|
request: SingleDiscoveryRequest,
|
|
db: Session = Depends(get_db_session)
|
|
):
|
|
service = SegmentDiscoveryService(db)
|
|
|
|
candidates = service.analyze_single_activity(request.activity_id)
|
|
|
|
# Convert to schema
|
|
results = []
|
|
for c in candidates:
|
|
results.append(CandidateSegmentSchema(
|
|
points=c.points,
|
|
frequency=c.frequency,
|
|
distance=c.distance,
|
|
activity_ids=c.activity_ids
|
|
))
|
|
|
|
return DiscoveryResult(
|
|
candidates=results,
|
|
generated_at=datetime.now(),
|
|
activity_count=1,
|
|
debug_paths=None
|
|
)
|
|
|
|
|