Flujo de subida

Subir un examen en 3 pasos

La subida de un examen es un flujo de 3 pasos. Los archivos van directo a Cloudflare R2 con URLs presignadas (no pasan por nuestros servidores), así que es rápido incluso con tomografías de 500 MB+.

Paso 1 — Crear el examen

Envía metadata del paciente y la lista de archivos (nombre + tamaño en bytes). Recibís un exam_id y URLs presignadas (válidas por 15 minutos).

bash
POST /api/v1/exams
{
  "name": "CBCT mandíbula",
  "patient_name": "Juan Pérez",
  "files": [
    { "name": "ct_001.dcm", "size": 524288 }
  ]
}

Paso 2 — Subir los archivos a R2

Por cada URL presignada, hacés un PUT con el contenido binario del archivo. R2 responde 200 OK si la subida fue exitosa. No necesitás autenticación adicional: la URL ya está firmada.

bash
PUT https://r2.cloudflarestorage.com/.../ct_001.dcm
Content-Type: application/dicom

<bytes>

Paso 3 — Confirmar

Una vez subidos todos los archivos, llamá a /confirm para marcar el examen como ready. Recibís share_url (link branded) y viewer_url (visor 3D directo).

bash
POST /api/v1/exams/{exam_id}/confirm

→ {
  "ok": true,
  "exam_id": "...",
  "status": "ready",
  "share_url": "https://cbcthub.com/share/...",
  "viewer_url": "https://cbcthub.com/viewer/..."
}

Diagrama del flujo

TU SISTEMA                CBCTHub API             Cloudflare R2
    │                         │                       │
    ├──POST /v1/exams────────►│                       │
    │                         │                       │
    │◄────exam_id, upload_urls┤                       │
    │                                                 │
    ├──PUT ct_001.dcm ────────────────────────────────►│
    ├──PUT ct_002.dcm ────────────────────────────────►│
    │◄───── 200 OK ───────────────────────────────────┤
    │                                                 │
    ├──POST /v1/exams/{id}/confirm ►│                 │
    │◄────share_url, viewer_url─────┤                 │

Idempotencia

/confirm es idempotente: llamarlo varias veces no duplica el examen. Si se perdió tu conexión justo después de un confirm exitoso, podés reintentar sin riesgo.

¿Qué pasa si tardo más de 15 minutos en subir?

Las URLs presignadas expiran a los 15 minutos. Si tu cliente no terminó la subida en ese tiempo, volvé a llamar POST /api/v1/exams para regenerar las URLs. El exam_id viejo queda en status uploading hasta que lo elimines.