- examples/fixture-invoicing/: FastAPI + Vue + Postgres demo (4-entity invoice fixture)
- cfg/sample/: wraps the fixture (managed.repos points at examples/)
- ctrl/kind-{up,down,status}.sh + per-room k8s render in soleprint/ctrl/k8s/
- build.py: relative repo paths, resilient rmtree, optional k8s render hook
- cfg/.gitignore: stop ignoring sample/ and standalone/ template rooms
Manifests render cleanly but kind cluster has not been run end-to-end yet.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
41 lines
1.2 KiB
Python
41 lines
1.2 KiB
Python
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()
|