"""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"}