Automated Action bad5cc0eba Build complete SaaS invoicing application with FastAPI
Features:
- JWT authentication with user registration and login
- Customer management with full CRUD operations
- Invoice management with automatic calculations
- Multi-tenant data isolation by user
- SQLite database with Alembic migrations
- RESTful API with comprehensive documentation
- Tax calculations and invoice status tracking
- Code formatted with Ruff linting
2025-06-20 09:52:34 +00:00

101 lines
3.0 KiB
Python

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