
# Pubblica una revisione della connessione

`POST /v1/connections/{connection_id}/revisions/{revision_id}:publish` · autorizzazione `connections:write`

Rende una bozza di revisione la configurazione attiva di una connessione enterprise. In un solo passaggio, il contenuto della revisione sostituisce quello attivo:

- SAML: l'entity ID del provider di identità, gli URL SSO e SLO e i certificati di firma della revisione;
- OIDC: i campi del client e, se la revisione ne contiene uno, il nuovo client secret;
- migrazione dell'host SP: l'host SP e gli URL SP. L'host precedente continua a rispondere per altri 30 giorni, poi restituisce `404`.

La revisione richiede un **test di accesso superato di quella revisione** delle ultime 24 ore: avviane uno con [Testa una connessione](test.md) e `revision_id`, e completalo nel browser. Testare la configurazione attiva non conta.

Pubblicare una revisione già pubblicata non scrive nulla e restituisce `200` con `already_published: true`; tra due pubblicazioni concorrenti, ne scrive una sola. La pubblicazione viene registrata nell'audit come `connection.revision_published`.

Non c'è un corpo della richiesta (non inviarne uno oppure invia `{}`), né `If-Match`: una revisione non ha una versione. Se la configurazione attiva è cambiata dopo la creazione della bozza, la pubblicazione viene rifiutata e devi creare una nuova bozza.

## Richiesta

| Campo | Tipo | Obbligatorio | Descrizione |
|---|---|---|---|
| `connection_id` | path | sì | ID della connessione enterprise (`conn_…`). |
| `revision_id` | path | sì | ID della revisione (`connrev_…`) da [Elenca le revisioni](revisions.md). |
| `Idempotency-Key` | header | no | Chiave facoltativa che rende sicuro ripetere una richiesta (16-64 caratteri). |

## Risposta

`200 OK`:

```json
{
  "revision": {
    "id": "connrev_01j9xr8c2d4e6f8g0h2j4k6m8n",
    "connection_id": "conn_01j9xp6q0r1s5t7v9w1x3y5z7b",
    "protocol": "saml",
    "kind": "sp_host",
    "status": "published",
    "discard_reason": null,
    "created_at": "2026-10-28T10:00:00Z",
    "decided_at": "2026-10-28T11:00:00Z",
    "purge_after": "2027-01-26T11:00:00Z",
    "superseded_revision_id": null,
    "changes": {
      "sp_host": "login.example.com",
      "idp_entity_id": null,
      "idp_sso_url": null,
      "idp_slo_url": null,
      "certificate_fingerprints": [],
      "mfa_authn_context_values": null,
      "issuer": null,
      "client_id": null,
      "client_auth_method": null,
      "provider_profile": null,
      "client_secret_change": null
    },
    "latest_test": {
      "test_id": "conntest_01j9xr4a6b8c0d2e4f6g8h0j2k",
      "status": "passed",
      "failure_reason": null,
      "started_at": "2026-10-28T10:05:00Z",
      "completed_at": "2026-10-28T10:06:00Z"
    }
  },
  "already_published": false
}
```

## Errori

| HTTP | code | Quando |
|---|---|---|
| 400 | `unknown_field` | Il corpo non è vuoto né `{}`. |
| 401 | `unauthenticated` | La credenziale è mancante, non valida o revocata. |
| 403 | `insufficient_permissions` | La credenziale non ha `connections:write`. |
| 404 | `not_found` | La connessione o la revisione non esistono in questo ambiente, oppure la revisione appartiene a un'altra connessione. |
| 409 | `conflict` | Una precondizione non è soddisfatta; `detail` indica quale: la revisione è stata scartata; non ha un test superato delle ultime 24 ore; la connessione è cambiata dopo la creazione della bozza (crea una nuova bozza); la finestra di 30 giorni della precedente migrazione dell'host SP è ancora aperta; il nuovo host SP non è più un host di questo ambiente; la connessione supererebbe 3 certificati di firma attivi. |
| 429 | `rate_limited` | È stato superato il limite di richieste; riprova dopo il periodo indicato in `Retry-After`. |
| 503 | `service_unavailable` | Una dipendenza non è temporaneamente disponibile; riprova dopo il periodo indicato in `Retry-After`. |

## Esempio

```bash
curl -X POST "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b/revisions/connrev_01j9xr8c2d4e6f8g0h2j4k6m8n:publish" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Idempotency-Key: $(uuidgen)"
```

```bash
keenauth connections revisions publish conn_01j9xp6q0r1s5t7v9w1x3y5z7b connrev_01j9xr8c2d4e6f8g0h2j4k6m8n --yes
```
