Ir al contenido

Adjuntos de resultado de ejecución

Durante una ejecución, un miembro puede registrar un resultado actual por paso (texto libre) y adjuntos de imagen opcionales (PNG, JPEG o WebP). El flujo es análogo al de adjuntos de paso de caso: las imágenes se procesan en servidor a WebP (tamaño completo, borde más largo ≤ 2048px, conservando proporción) y se genera una miniatura (≤ 320px), siguiendo el patrón stage-and-commit.

El acceso requiere rol member o superior en una ejecución open. Todas las operaciones de escritura (stage, commit, delete) se rechazan con 409 en una ejecución closed; las lecturas siguen permitidas (el panel es de solo lectura).

  1. StagePOST /api/v1/runs/{runUlid}/cases/{runCaseUlid}/steps/{stepUlid}/result-attachments:stage con multipart/form-data y una o más partes file. Escribe en staging/<orgUlid>/ y devuelve referencias en estado staged (sin fila aún).
  2. CommitPATCH /api/v1/runs/{runUlid}/cases/{runCaseUlid}/steps/{stepUlid}/result con el texto actualResult y los refs en attachments[]. El servidor copia staged → claves permanentes (attachments/<orgUlid>/<projectUlid>/run-steps/<runCaseStepUlid>/<attUlid>.webp), inserta filas, borra los objetos staged y persiste el texto.
  3. LecturaGET /api/v1/runs/{runUlid}/cases/{runCaseUlid} devuelve actualResult y attachments[] por paso (ordenado por position). Las miniaturas se sirven en GET /__assets/{thumbKey}.

Los objetos staged abandonados expiran automáticamente mediante la regla de ciclo de vida de R2 (~48 h).

Ventana de terminal
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-F "file=@captura.png" \
"https://probara.net/api/v1/runs/$RUN/cases/$RC/steps/$ST/result-attachments:stage"

200 devuelve la misma forma que adjuntos de paso (StagedRunResultAttachmentRef).

{
"actualResult": "Apareció HTTP 500 en lugar del dashboard",
"attachments": [
{
"ulid": "01J...ATT",
"position": 0,
"objectKey": "staging/01J...ORG/01J...UPLOAD.webp",
"thumbKey": "staging/01J...ORG/01J...UPLOAD_thumb.webp",
"mime": "image/webp",
"byteSize": 8420,
"width": 1200,
"height": 800,
"originalFilename": "captura.png"
}
]
}

La reconciliación funciona exactamente igual que con adjuntos de paso: los ulids nuevos se promueven, los existentes se conservan (solo se actualiza position), y cualquier ulid ya almacenado que se omita del payload se borra (filas + R2 permanente + contador de almacenamiento).

El servidor no confía en los valores byteSize, width ni height enviados por el cliente al hacer commit — los re-mide leyendo R2. Los refs staged cuyo prefijo de clave no coincida con la organización del solicitante se rechazan (guardia cross-tenant).

actualResult: null limpia el texto; omitirlo deja el valor anterior intacto. Omitir attachments deja el conjunto comprometido sin tocar.

Ventana de terminal
curl -sS -X DELETE \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/runs/$RUN/cases/$RC/steps/$ST/result-attachments/$ATT"

204 en éxito. 404 cuando el adjunto no existe o pertenece a otra organización. 409 cuando la ejecución está cerrada.

El tablero de ejecución rediseñado añade dos operaciones a nivel de caso:

  • POST /api/v1/runs/{runUlid}/cases/{runCaseUlid}/retry — reinicia el caso (y los snapshots de sus pasos) a untested y recalcula el agregado. Emite run.case_retried.
  • DELETE /api/v1/runs/{runUlid}/cases/{runCaseUlid} — quita el caso (cascada: pasos + adjuntos de resultado) y recalcula el agregado. Emite run.case_removed.

Ambas requieren member+ sobre una ejecución open y devuelven 409 cuando la ejecución está closed.

Los bytes de adjuntos de resultado comprometidos (completo + miniatura) incrementan organization_storage_usage para la categoría run_result_attachment. Los bytes en staging no se contabilizan. El contador es la base para los futuros planes de precios.