diff --git a/.env.example b/.env.example index 9e084d9..36151c0 100644 --- a/.env.example +++ b/.env.example @@ -186,3 +186,18 @@ GIT_SYNC_CRON=hourly GIT_SYNC_TTL=55 GIT_MAX_ISSUES=25 GIT_HTTP_TIMEOUT=15 + +############################################################################### +# TaskStream — the issue tracker +############################################################################### +# `taskstream: true` on POST /v1/projects opens a public board there too. +# Both default to production. +TASKSTREAM_API_URL=https://api.taskstream.pireon.dev +TASKSTREAM_WEB_URL=https://taskstream.pireon.dev + +# A Pireon personal access token (oauth.pireon.dev/tokens), only used when the +# caller signs in with a machine token (pmt_…), which TaskStream cannot read. +# People with a Pireon token have theirs passed on instead. Empty: machine +# tokens cannot ask for a board. +TASKSTREAM_TOKEN= +TASKSTREAM_HTTP_TIMEOUT=10 diff --git a/README.md b/README.md index d77efac..73243aa 100644 --- a/README.md +++ b/README.md @@ -525,6 +525,46 @@ fuera. Añadir GitLab es escribir una clase que implemente [`RepositoryProvider`](app/Services/Git/Contracts/RepositoryProvider.php) y registrarla en `config/git.php`, sin tocar nada más. +## Tableros en TaskStream + +Al crear un proyecto por la API, `taskstream: true` le abre también un tablero +en [TaskStream](https://taskstream.pireon.dev), el gestor de tareas del +colectivo, y la respuesta trae el enlace: + +```json +POST /api/v1/projects +{ "title": { "es": "Catálogo abierto" }, "slug": { "es": "catalogo" }, "taskstream": true } + +→ 201 { "data": { …, "taskstream_key": "CATALOGO", "taskstream_url": "https://taskstream.pireon.dev/p/CATALOGO" } } +``` + +- **Público** siempre: es el tablero de un proyecto que se enseña. +- **Clave**: la de `taskstream_key` (de 2 a 10 letras o cifras, empezando por + letra) o, si no se indica, una sacada del slug en el idioma por defecto: de + una palabra, sus diez primeros caracteres (`catalogo` → `CATALOGO`); de + varias, sus iniciales (`mi-web-nueva` → `MWN`). +- **Primero TaskStream**: si lo rechaza (una clave ya usada, por ejemplo), aquí + no se crea nada y el motivo vuelve como error de validación (422); si no + responde, 502. Así no quedan proyectos a medias ni webhooks de algo que no + existe. +- **A nombre de quien lo pide**: TaskStream acepta los mismos tokens de Pireon + que esta API, y se le pasa el de quien llama. Un token de máquina (`pmt_…`) + allí no significa nada, así que esas peticiones usan `TASKSTREAM_TOKEN`; sin + él, no pueden pedir tablero. +- Solo al crear: en una edición los dos campos se ignoran, y un proyecto + duplicado no hereda el tablero del original. + +```dotenv +TASKSTREAM_API_URL=https://api.taskstream.pireon.dev # por defecto +TASKSTREAM_WEB_URL=https://taskstream.pireon.dev # de aquí sale el enlace +TASKSTREAM_TOKEN= # token personal de Pireon, solo para tokens de máquina +TASKSTREAM_HTTP_TIMEOUT=10 +``` + +El cliente está en [`TaskStreamClient`](app/Services/TaskStream/TaskStreamClient.php) +y la lógica (clave, token, errores) en +[`OpenInTaskStream`](app/Actions/Projects/OpenInTaskStream.php). + ## API pública (para el frontend) Sin autenticación y de solo lectura. Todo lo que devuelve ya está publicado en