from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.auth.deps import get_current_user from app.database import get_db from app.models.user import User from app.schemas.page import PageCreate, PageUpdate, PageResponse from app.services import pages as page_service from typing import List router = APIRouter(prefix="/pages", tags=["Pages"]) @router.get("", response_model=List[PageResponse]) async def list_pages(db: AsyncSession = Depends(get_db)): """List all published pages.""" pages = await page_service.get_published_pages(db) return [PageResponse.model_validate(p) for p in pages] @router.get("/{slug}", response_model=PageResponse) async def get_page(slug: str, db: AsyncSession = Depends(get_db)): """Get a single published page by slug.""" page = await page_service.get_page_by_slug(db, slug, published_only=True) if page is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Page '{slug}' not found") return PageResponse.model_validate(page) @router.post("", response_model=PageResponse, status_code=status.HTTP_201_CREATED) async def create_page( data: PageCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """Create a new page (auth required).""" page = await page_service.create_page(db, data) return PageResponse.model_validate(page) @router.put("/{slug}", response_model=PageResponse) async def update_page( slug: str, data: PageUpdate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """Update a page by slug (auth required).""" page = await page_service.update_page(db, slug, data) if page is None: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Page '{slug}' not found") return PageResponse.model_validate(page) @router.delete("/{slug}", status_code=status.HTTP_204_NO_CONTENT) async def delete_page( slug: str, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user), ): """Delete a page by slug (auth required).""" deleted = await page_service.delete_page(db, slug) if not deleted: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"Page '{slug}' not found")