from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from db import get_session from models import Invoice, LineItem from schemas import LineItemIn, LineItemOut router = APIRouter() @router.get("", response_model=list[LineItemOut]) def list_line_items( invoice_id: int | None = None, session: Session = Depends(get_session) ): query = session.query(LineItem).order_by(LineItem.id) if invoice_id: query = query.filter(LineItem.invoice_id == invoice_id) return query.all() @router.post("/invoices/{invoice_id}", response_model=LineItemOut, status_code=201) def add_line_item( invoice_id: int, payload: LineItemIn, session: Session = Depends(get_session) ): if not session.get(Invoice, invoice_id): raise HTTPException(404, "invoice not found") item = LineItem(invoice_id=invoice_id, **payload.model_dump()) session.add(item) session.commit() session.refresh(item) return item @router.delete("/{line_item_id}", status_code=204) def delete_line_item(line_item_id: int, session: Session = Depends(get_session)): item = session.get(LineItem, line_item_id) if not item: raise HTTPException(404, "line item not found") session.delete(item) session.commit()