Voltar ao Blog
    Backend
    Saúde

    FastAPI + React: Construindo APIs Para Healthcare

    Pydantic para validação, SQLModel para o ORM e React Query para o estado — a stack que uso em projetos de saúde.

    Publicado em ·10 min de leitura·por Bernardo Gomes

    Por que FastAPI para healthcare

    FastAPI combina validação automática via Pydantic, documentação OpenAPI gerada automaticamente e performance comparável a Node.js. Em projetos de saúde, a validação automática é especialmente valiosa — você define o schema uma vez e a API rejeita dados inválidos por padrão.

    Estrutura do projeto

    bash
    healthcare-api/
    ├── app/
    │   ├── main.py
    │   ├── models/
    │   │   ├── patient.py
    │   │   └── appointment.py
    │   ├── schemas/
    │   │   ├── patient.py
    │   │   └── appointment.py
    │   ├── services/
    │   │   ├── patient_service.py
    │   │   └── appointment_service.py
    │   └── dependencies.py
    ├── tests/
    └── pyproject.toml

    Definindo modelos com SQLModel

    SQLModel unifica SQLAlchemy ORM e Pydantic em uma única classe. Você define o modelo uma vez e usa tanto para queries de banco quanto para validação de API.

    python
    from sqlmodel import SQLModel, Field
    from datetime import date, datetime
    from typing import Optional
    
    class PatientBase(SQLModel):
        name: str = Field(min_length=2, max_length=200)
        cpf: str = Field(regex=r"\d{11}")
        birth_date: date
    
    class Patient(PatientBase, table=True):
        id: Optional[int] = Field(default=None, primary_key=True)
        created_at: datetime = Field(default_factory=datetime.utcnow)
    
    class PatientCreate(PatientBase):
        pass
    
    class PatientRead(PatientBase):
        id: int
        created_at: datetime

    Endpoints com validação automática

    python
    from fastapi import APIRouter, Depends, HTTPException
    from sqlmodel import Session
    
    router = APIRouter(prefix="/patients", tags=["patients"])
    
    @router.post("/", response_model=PatientRead, status_code=201)
    async def create_patient(
        patient: PatientCreate,
        session: Session = Depends(get_session),
    ) -> PatientRead:
        db_patient = Patient.model_validate(patient)
        session.add(db_patient)
        session.commit()
        session.refresh(db_patient)
        return db_patient
    
    @router.get("/{patient_id}", response_model=PatientRead)
    async def get_patient(patient_id: int, session: Session = Depends(get_session)):
        patient = session.get(Patient, patient_id)
        if not patient:
            raise HTTPException(status_code=404, detail="Paciente não encontrado")
        return patient

    React Query no frontend

    React Query gerencia o estado do servidor no frontend: cache, revalidação, loading/error states e background refresh. Para APIs de healthcare com dados que mudam, isso simplifica muito a lógica do cliente.

    typescript
    export function usePatient(id: number) {
      return useQuery({
        queryKey: ["patients", id],
        queryFn: () => api.get<PatientRead>(`/patients/${id}`),
        staleTime: 5 * 60 * 1000,
      });
    }
    
    export function useCreatePatient() {
      const queryClient = useQueryClient();
      return useMutation({
        mutationFn: (data: PatientCreate) => api.post<PatientRead>("/patients/", data),
        onSuccess: () => {
          queryClient.invalidateQueries({ queryKey: ["patients"] });
        },
      });
    }
    ℹ️

    A documentação Swagger automática do FastAPI (em /docs) é especialmente útil em projetos de saúde onde há múltiplos times consumindo a API — todos têm a mesma fonte de verdade do contrato.