Ir al contenido

API de hitos

Los hitos son unidades de planificación por proyecto que agrupan ejecuciones de prueba y permiten hacer seguimiento del avance hacia un lanzamiento. Cada hito tiene un ULID asignado por el servidor, un ciclo de vida de estado (upcomingactivecompleted | archived), campos de fecha opcionales y un padre opcional para jerarquías de un nivel.

POST/api/v1/projects/{projectId}/milestones

{projectId} es el código del proyecto (por ejemplo ACME).

CampoObligatorioNotas
nameCadena no vacía, máximo 255 caracteres. Debe ser único entre los hitos activos del proyecto
descriptionnoTexto libre, máximo 2000 caracteres
statusnoUno de upcoming, active, completed, archived. Por defecto upcoming
startAtnoMilisegundos de época Unix. Debe ser ≤ dueAt si ambos están presentes
dueAtnoMilisegundos de época Unix
forecastAtnoMilisegundos de época Unix
parentIdnoULID del hito padre en el mismo proyecto (solo 1 nivel)

Los campos ulid enviados por el cliente son rechazados.

Un nombre duplicado activo dentro del mismo proyecto devuelve 409 conflict. Una violación de orden de fechas (dueAt < startAt) o campos requeridos faltantes devuelven 422 validation_failed.

201 con el objeto del hito creado. Ver Campos de respuesta.

Ventana de terminal
curl -sS -X POST \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name":"Lanzamiento v2.0","status":"upcoming","startAt":1700000000000,"dueAt":1700600000000}' \
"https://probara.net/api/v1/projects/ACME/milestones"
GET/api/v1/projects/{projectId}/milestones

Devuelve los hitos activos (no eliminados) del proyecto, ordenados por ULID de forma ascendente. Paginación basada en páginas.

ParámetroNotas
pageNúmero de página (base 1, por defecto 1)
pageSizeElementos por página (por defecto 50, máximo 200)
qBúsqueda de subcadena insensible a mayúsculas en el nombre del hito
statusFiltrar por estado exacto: upcoming, active, completed o archived
viewForma de la respuesta: flat (por defecto) o tree. Ver Vistas de la lista

El parámetro view selecciona la forma de la respuesta. Es aditivo — omitirlo (o pasar flat) devuelve exactamente la misma respuesta que antes.

viewitemstotalUnidad de paginación
flat (por defecto)Todos los hitos vigentes (padres e hijos como hermanos)Conteo de todos los hitos vigentesHito individual
treeSolo hitos padre (los que no tienen padre), cada uno con un arreglo children de sus hijos directos vigentesConteo de hitos padre únicamente (los hijos nunca se cuentan)Hito padre

En modo tree:

  • items contiene solo padres. Cada elemento padre es el objeto de hito estándar más un arreglo children.
  • Cada entrada de children es un objeto de hito plano (la misma forma de respuesta); los hijos nunca llevan su propia clave children (la jerarquía es de un nivel).
  • q y status filtran solo padres. Un padre que coincide con el filtro muestra todos sus hijos vigentes sin importar el estado propio de los hijos.
  • total es el conteo de padres, por lo que el paginador (X–Y de Z) cuenta secciones padre. Un padre y sus hijos nunca se reparten entre páginas.
  • Un padre sin hijos tiene children: [].

200 con { items, page, pageSize, total }. En modo flat cada elemento sigue la forma de respuesta; en modo tree cada elemento es esa forma extendida con un arreglo children (ver Vistas de la lista).

Ventana de terminal
# Plana (por defecto)
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/projects/ACME/milestones?status=active"
# Secciones agrupadas por padre con hijos anidados
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/projects/ACME/milestones?view=tree"

Ejemplo de respuesta tree (truncada):

{
"items": [
{
"ulid": "01JPARENT...",
"name": "Lanzamiento 2.4",
"status": "active",
"children": [{ "ulid": "01JCHILD...", "name": "Autenticación 2.4", "status": "active" }]
}
],
"page": 1,
"pageSize": 50,
"total": 1
}
GET/api/v1/milestones/{milestoneUlid}

Devuelve un único hito activo con alcance a la organización activa, incluyendo agregados de progreso en tiempo real.

Devuelve 404 not_found cuando el hito está fuera de la organización activa o ha sido eliminado.

Ventana de terminal
curl -sS \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/milestones/01JXXXXXXXXXXXXXXXXXXXXXXXXX"
PATCH/api/v1/milestones/{milestoneUlid}

Actualización parcial. Se debe proporcionar al menos un campo; un cuerpo vacío devuelve 422 validation_failed.

CampoObligatorioNotas
namenoCadena no vacía, máximo 255 caracteres
descriptionnoMáximo 2000 caracteres, o null para borrar
statusnoEstado destino. Debe seguir las transiciones válidas (ver Ciclo de vida del estado)
startAtnoMilisegundos de época Unix, o null para borrar
dueAtnoMilisegundos de época Unix. Debe ser ≥ startAt si ambos están definidos
forecastAtnoMilisegundos de época Unix, o null para borrar
parentIdnoULID del nuevo padre en el mismo proyecto, o null para desvincularlo

Las transiciones de estado inválidas devuelven 422 validation_failed. Un nombre duplicado activo devuelve 409 conflict. Devuelve 404 not_found cuando el hito está fuera de la organización activa.

Ventana de terminal
curl -sS -X PATCH \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"status":"active","dueAt":1700700000000}' \
"https://probara.net/api/v1/milestones/01JXXXXXXXXXXXXXXXXXXXXXXXXX"
DELETE/api/v1/milestones/{milestoneUlid}

Elimina el hito de forma lógica (soft-delete). Devuelve 204 si tiene éxito. Un GET posterior devuelve 404 not_found y el hito queda excluido de los resultados de listado.

La eliminación desvincula atómicamente todas las ejecuciones de prueba, casos de prueba e hitos hijos asociados.

Devuelve 404 not_found cuando el hito está fuera de la organización activa.

Ventana de terminal
curl -sS -X DELETE \
-H "Authorization: Bearer $PROBARA_API_TOKEN" \
"https://probara.net/api/v1/milestones/01JXXXXXXXXXXXXXXXXXXXXXXXXX"

Los hitos siguen una máquina de estados dirigida. Solo se aceptan las transiciones indicadas; cualquier otra devuelve 422 validation_failed.

DesdeTransiciones permitidas
upcomingactive, archived
activecompleted, archived
completedactive (reabrir), archived
archived— (terminal)

La transición a completed establece automáticamente completedAt con la marca de tiempo actual. Salir del estado completed borra completedAt.

Todos los endpoints mutadores (POST, PATCH) y GET /api/v1/milestones/{milestoneUlid} devuelven un objeto de hito.

CampoTipoNotas
ulidstring (ULID)Identificador único asignado por el servidor
projectIdstringCódigo del proyecto al que pertenece el hito
namestringNombre para mostrar
descriptionstring | nullDescripción opcional
statusstringEstado actual: upcoming, active, completed o archived
startAtnumber | nullMilisegundos de época Unix
dueAtnumber | nullMilisegundos de época Unix
forecastAtnumber | nullMilisegundos de época Unix
completedAtnumber | nullSe establece automáticamente al transicionar a completed
parentIdstring (ULID) | nullULID del hito padre, o null si es de nivel raíz
progress.totalRunsnumberTotal de ejecuciones de prueba vinculadas al hito
progress.closedRunsnumberEjecuciones cerradas (finalizadas)
progress.percentCompletenumberclosedRuns / totalRuns × 100, redondeado; 0 sin ejecuciones
progress.passRatenumberpassed / totalResults × 100, redondeado; 0 sin resultados
progress.passednumberResultados de casos de prueba aprobados en todas las ejecuciones vinculadas
progress.failednumberResultados de casos de prueba fallidos
progress.blockednumberResultados de casos de prueba bloqueados
progress.skippednumberResultados de casos de prueba omitidos
progress.untestednumberCasos de prueba no ejecutados aún
authorobject | nullUsuario que creó el hito, o null para hitos creados con token de API y hitos anteriores a este campo
author.kindstringSiempre "user" cuando está presente
author.ulidstring (ULID)Identificador del usuario
author.displayNamestringNombre completo o correo electrónico del autor
author.avatarKeystring | nullClave de almacenamiento de la imagen de avatar del autor
childCountnumberNúmero de hitos hijos directos
testCaseCountnumberNúmero de casos de prueba vinculados al hito
createdAtnumberMilisegundos de época Unix
updatedAtnumberMilisegundos de época Unix

Las mutaciones de hitos emiten los siguientes eventos en el historial de actividad de la organización:

AcciónDisparador
milestone.createdHito creado
milestone.updatedCualquier campo actualizado mediante PATCH
milestone.status_changedCampo de estado cambiado mediante PATCH
milestone.deletedHito eliminado de forma lógica

Ver Eventos de auditoría.