from fastapi import APIRouter, Depends, HTTPException, status, Query from sqlalchemy.orm import Session from typing import List from app.db.session import get_db from app.services.invoice_service import InvoiceService from app.schemas.invoice import Invoice, InvoiceCreate, InvoiceUpdate from app.core.deps import get_current_user from app.models.user import User from app.models.invoice import InvoiceStatus router = APIRouter() @router.get("/", response_model=List[Invoice]) def get_invoices( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=100), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) return invoice_service.get_invoices(current_user.id, skip, limit) @router.post("/", response_model=Invoice, status_code=status.HTTP_201_CREATED) def create_invoice( invoice_data: InvoiceCreate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) return invoice_service.create_invoice(invoice_data, current_user.id) @router.get("/{invoice_id}", response_model=Invoice) def get_invoice( invoice_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) invoice = invoice_service.get_invoice(invoice_id, current_user.id) if not invoice: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found" ) return invoice @router.put("/{invoice_id}", response_model=Invoice) def update_invoice( invoice_id: int, invoice_data: InvoiceUpdate, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) invoice = invoice_service.update_invoice(invoice_id, invoice_data, current_user.id) if not invoice: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found" ) return invoice @router.delete("/{invoice_id}", status_code=status.HTTP_204_NO_CONTENT) def delete_invoice( invoice_id: int, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) success = invoice_service.delete_invoice(invoice_id, current_user.id) if not success: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found" ) @router.patch("/{invoice_id}/status", response_model=Invoice) def update_invoice_status( invoice_id: int, status: InvoiceStatus, current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): invoice_service = InvoiceService(db) invoice = invoice_service.update_invoice_status(invoice_id, status, current_user.id) if not invoice: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Invoice not found" ) return invoice