from fastapi import APIRouter, status, Path, Depends, HTTPException from sqlmodel import select, Session from src import database from src.models.models import Record, RecordRead, RecordCreate router = APIRouter(prefix="/records", tags=["Records"]) @router.get("/", response_model=list[RecordRead], summary="Get a list of all records") async def all_records( *, session: Session = Depends(database.get_session) ) -> list[Record]: """Returns a list of all records.""" records = session.exec(select(Record)).all() return records @router.post("/", status_code=status.HTTP_201_CREATED) async def add_record( *, record: RecordCreate, session: Session = Depends(database.get_session) ): """Start a record.""" db_record = Record.from_orm(record) session.add(db_record) session.commit() session.refresh(db_record) return db_record @router.get("/{id}", response_model=RecordRead) async def get_record( *, id: str = Path(..., title="ID of the record"), session: Session = Depends(database.get_session) ) -> Record: """Fetch a record by id.""" record = session.get(Record, id) if not record: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) return record @router.delete("/{id}", status_code=status.HTTP_204_NO_CONTENT) async def delete_record( *, id: str = Path(..., title="ID of the record"), session: Session = Depends(database.get_session) ): """Delete a record specified by id.""" record = session.get(Record, id) if not record: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) session.delete(record) session.commit() # TODO: This method implicitly returns None, which will be converted to null by FastAPI, which triggers a # warning, because the method returns with header HTTP_204_NO_CONTENT, but has content @router.patch("/{id}", summary="Apply partial updates to a record by id") async def patch_record( *, record: RecordCreate, id: str = Path(..., title="ID of the record"), session: Session = Depends(database.get_session) ): """Apply partial updates to a record.""" # Fetch record by id from database db_record = session.get(Record, id) if not db_record: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND) # Set all provided arguments in the database record for key, value in record.dict(exclude_unset=True).items(): setattr(db_record, key, value) # Write modified record to database session.add(db_record) session.commit() session.refresh(db_record) return db_record