from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.ext.asyncio import AsyncSession from typing import Annotated, Optional from app.database import get_db from app.services.quotation import QuotationService from app.api.v1.deps import get_current_user_id router = APIRouter() @router.post("") async def create_quotation( data: dict, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = QuotationService(db) try: quotation = await service.create_quotation(user_id, data) return quotation except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @router.get("") async def list_quotations( page: int = Query(1, ge=1), size: int = Query(20, ge=1, le=100), user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = QuotationService(db) return await service.list_quotations(user_id, page, size) @router.get("/{quotation_id}") async def get_quotation( quotation_id: str, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = QuotationService(db) quotation = await service.get_quotation(user_id, quotation_id) if not quotation: raise HTTPException(status_code=404, detail="Quotation not found") return quotation @router.patch("/{quotation_id}/status") async def update_quotation_status( quotation_id: str, data: dict, user_id: str = Depends(get_current_user_id), db: Annotated[AsyncSession, Depends(get_db)] = None, ): service = QuotationService(db) quotation = await service.update_status(user_id, quotation_id, data.get("status", "draft")) if not quotation: raise HTTPException(status_code=404, detail="Quotation not found") return quotation