from datetime import date from typing import Optional from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import Session from database import get_db from models import EggCollection from schemas import EggCollectionCreate, EggCollectionUpdate, EggCollectionOut router = APIRouter(prefix="/api/eggs", tags=["eggs"]) @router.get("", response_model=list[EggCollectionOut]) def list_eggs( start: Optional[date] = None, end: Optional[date] = None, db: Session = Depends(get_db), ): q = select(EggCollection).order_by(EggCollection.date.desc()) if start: q = q.where(EggCollection.date >= start) if end: q = q.where(EggCollection.date <= end) return db.scalars(q).all() @router.post("", response_model=EggCollectionOut, status_code=201) def create_egg_collection(body: EggCollectionCreate, db: Session = Depends(get_db)): record = EggCollection(**body.model_dump()) db.add(record) try: db.commit() except IntegrityError: db.rollback() raise HTTPException(status_code=409, detail=f"An entry for {body.date} already exists. Edit it from the History page.") db.refresh(record) return record @router.put("/{record_id}", response_model=EggCollectionOut) def update_egg_collection( record_id: int, body: EggCollectionUpdate, db: Session = Depends(get_db), ): record = db.get(EggCollection, record_id) if not record: raise HTTPException(status_code=404, detail="Record not found") for field, value in body.model_dump(exclude_none=True).items(): setattr(record, field, value) try: db.commit() except IntegrityError: db.rollback() raise HTTPException(status_code=409, detail=f"An entry for that date already exists.") db.refresh(record) return record @router.delete("/{record_id}", status_code=204) def delete_egg_collection(record_id: int, db: Session = Depends(get_db)): record = db.get(EggCollection, record_id) if not record: raise HTTPException(status_code=404, detail="Record not found") db.delete(record) db.commit()