diff --git a/backend/app/routers/views.py b/backend/app/routers/views.py new file mode 100644 index 0000000..1afe60b --- /dev/null +++ b/backend/app/routers/views.py @@ -0,0 +1,54 @@ +"""View routes.""" +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy.orm import Session +from typing import List + +from app.database import get_db +from app.models.view import View +from app.schemas.view import ViewCreate, ViewUpdate, ViewResponse + +router = APIRouter(prefix="/views", tags=["views"]) + +@router.get("/table/{table_id}", response_model=List[ViewResponse]) +def list_views(table_id: int, db: Session = Depends(get_db)): + """List all views for a table.""" + return db.query(View).filter(View.table_id == table_id).all() + +@router.post("", response_model=ViewResponse) +def create_view(view: ViewCreate, db: Session = Depends(get_db)): + """Create new view.""" + db_view = View(**view.model_dump()) + db.add(db_view) + db.commit() + db.refresh(db_view) + return db_view + +@router.get("/{view_id}", response_model=ViewResponse) +def get_view(view_id: int, db: Session = Depends(get_db)): + """Get view by ID.""" + view = db.query(View).filter(View.id == view_id).first() + if not view: + raise HTTPException(status_code=404, detail="View not found") + return view + +@router.put("/{view_id}", response_model=ViewResponse) +def update_view(view_id: int, view: ViewUpdate, db: Session = Depends(get_db)): + """Update view.""" + db_view = db.query(View).filter(View.id == view_id).first() + if not db_view: + raise HTTPException(status_code=404, detail="View not found") + for key, value in view.model_dump(exclude_unset=True).items(): + setattr(db_view, key, value) + db.commit() + db.refresh(db_view) + return db_view + +@router.delete("/{view_id}") +def delete_view(view_id: int, db: Session = Depends(get_db)): + """Delete view.""" + view = db.query(View).filter(View.id == view_id).first() + if not view: + raise HTTPException(status_code=404, detail="View not found") + db.delete(view) + db.commit() + return {"message": "View deleted"}