from fastapi import APIRouter, HTTPException, Depends from sqlalchemy.orm import Session from typing import List from datetime import datetime from app.schemas import ( Puck as PuckSchema, Sample as SampleSchema, SampleEventResponse, SampleEventCreate, ) from app.models import ( Puck as PuckModel, Sample as SampleModel, SampleEvent as SampleEventModel, ) from app.dependencies import get_db import logging router = APIRouter() @router.get("/{puck_id}/samples", response_model=List[SampleSchema]) async def get_samples_with_events(puck_id: str, db: Session = Depends(get_db)): puck = db.query(PuckModel).filter(PuckModel.id == puck_id).first() if not puck: raise HTTPException(status_code=404, detail="Puck not found") samples = db.query(SampleModel).filter(SampleModel.puck_id == puck_id).all() for sample in samples: sample.events = ( db.query(SampleEventModel) .filter(SampleEventModel.sample_id == sample.id) .all() ) return samples @router.get("/pucks-samples", response_model=List[PuckSchema]) async def get_all_pucks_with_samples_and_events(db: Session = Depends(get_db)): logging.info("Fetching all pucks with samples and events") pucks = db.query(PuckModel).all() logging.info(f"Found {len(pucks)} pucks in the database") for puck in pucks: logging.info(f"Puck ID: {puck.id}, Name: {puck.puck_name}") if not pucks: raise HTTPException( status_code=404, detail="No pucks found in the database" ) # More descriptive return pucks # Route to post a new sample event @router.post("/samples/{sample_id}/events", response_model=SampleEventResponse) async def create_sample_event( sample_id: int, event: SampleEventCreate, db: Session = Depends(get_db) ): # Ensure the sample exists sample = db.query(SampleModel).filter(SampleModel.id == sample_id).first() if not sample: raise HTTPException(status_code=404, detail="Sample not found") # Create the event sample_event = SampleEventModel( sample_id=sample_id, event_type=event.event_type, timestamp=datetime.now(), # Use the current timestamp ) db.add(sample_event) db.commit() db.refresh(sample_event) return ( sample_event # Response will automatically use the SampleEventResponse schema ) # Route to fetch the last (most recent) sample event @router.get("/samples/{sample_id}/events/last", response_model=SampleEventResponse) async def get_last_sample_event(sample_id: int, db: Session = Depends(get_db)): # Ensure the sample exists sample = db.query(SampleModel).filter(SampleModel.id == sample_id).first() if not sample: raise HTTPException(status_code=404, detail="Sample not found") # Get the most recent event for the sample last_event = ( db.query(SampleEventModel) .filter(SampleEventModel.sample_id == sample_id) .order_by(SampleEventModel.timestamp.desc()) .first() ) if not last_event: raise HTTPException(status_code=404, detail="No events found for the sample") return last_event # Response will automatically use the SampleEventResponse schema