
# Mettre à jour les valeurs par défaut de l'organisation

`PATCH /v1/organization-defaults` · autorisation `organizations:write`

Met à jour les valeurs par défaut de l'organisation de l'environnement à l'aide d'un correctif de fusion JSON (`application/merge-patch+json`, RFC 7396). `If-Match` est obligatoire : son absence renvoie `428`, une version obsolète renvoie `412`. N'envoyez que les champs que vous modifiez. Un correctif qui ne change rien n'écrit rien et conserve la version.

## Requête

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `If-Match` | en-tête | oui | Le `ETag` des valeurs par défaut tel que lu en dernier. Absent : `428` ; obsolète : `412`. |
| `org_admin_role_id` | string | non | Rôle de l'environnement (`rol_…`) attribué aux administrateurs de l'organisation. Il doit détenir les autorisations de gestion des organisations (`422 permission_reserved`), et aucune organisation ne peut rester sans administrateur actif (`409 last_org_admin`). Ne peut pas être `null`. |
| `default_member_role_id` | string | non | Rôle de l'environnement (`rol_…`) attribué aux nouveaux membres de l'organisation. Ne peut pas être `null`. |
| `max_memberships_per_user` | integer | non | Nombre d'organisations auxquelles un utilisateur peut appartenir, de 1 à 1000 (par défaut 200). Ne peut pas être `null`. |
| `invitation_ttl_days` | integer | non | Nombre de jours pendant lesquels une invitation reste valide, de 1 à 30 (par défaut 7). Ne peut pas être `null`. |
| `org_self_service_deletion_grace_days` | integer | non | Nombre de jours d'attente avant l'exécution d'une suppression d'organisation en libre-service, de 0 à 30 (par défaut 14). Ne peut pas être `null`. |
| `on_org_delete_members` | string | non | `detach` (par défaut) : les membres perdent seulement leur appartenance. `delete_exclusive_provisioned` : les utilisateurs arrivés dans cette organisation via JIT ou SCIM et n'appartenant à aucune autre organisation sont placés en file d'attente pour suppression. Ne peut pas être `null`. |
| `org_custom_roles_enabled` | boolean | non | Permet aux administrateurs de l'organisation de définir leurs propres rôles (par défaut `false`). L'écriture des rôles d'organisation nécessite toujours la fonctionnalité d'offre `org_custom_roles`. Ne peut pas être `null`. |
| `org_self_delete_enabled` | boolean | non | Permet aux administrateurs de l'organisation de supprimer eux-mêmes leur organisation (par défaut `false`). Ne peut pas être `null`. |

## Comportement

- Les champs de rôle doivent désigner un rôle de cet environnement ; un rôle d'organisation ou un rôle inconnu renvoie `422 validation_failed` avec `unknown_role`.
- La modification de `on_org_delete_members` s'applique aux organisations supprimées après cette modification.
- Les erreurs de validation portent le pointeur JSON du champ, par exemple `/invitation_ttl_days` avec le code `out_of_range`.
- La modification est écrite dans le journal d'audit de gestion sous `organization_defaults.updated`, avec les noms des champs modifiés, jamais leurs valeurs.

## Réponse

`200 OK` avec les valeurs par défaut mises à jour et le nouveau `ETag`.

```json
{
  "org_admin_role_id": "rol_01j9xs0a2b4c6d8e0f2g4h6j8k",
  "default_member_role_id": "rol_01j9xs0a2b4c6d8e0f2g4h6j8m",
  "max_memberships_per_user": 200,
  "invitation_ttl_days": 9,
  "org_self_service_deletion_grace_days": 14,
  "on_org_delete_members": "delete_exclusive_provisioned",
  "org_custom_roles_enabled": false,
  "org_self_delete_enabled": false,
  "updated_at": "2026-11-03T10:00:00.123456Z",
  "version": 2
}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 400 | `unknown_field` | Le correctif contient un champ inconnu ou en lecture seule, ou n'est pas un objet JSON (`malformed_request`). |
| 403 | `insufficient_permissions` | L'identifiant ne dispose pas de l'autorisation requise. |
| 409 | `last_org_admin` | Le nouveau rôle d'administrateur laisserait une organisation sans administrateur actif. |
| 412 | `precondition_failed` | `If-Match` ne correspond pas à la version actuelle. |
| 415 | `unsupported_media_type` | Le type de contenu n'est pas `application/merge-patch+json`. |
| 422 | `validation_failed` | Une valeur est invalide (le pointeur désigne le champ), ou un champ a été défini à `null` (`code: invalid`). |
| 428 | `precondition_required` | `If-Match` est absent. |

## Exemple

```bash
curl -i -X PATCH "https://api.eu.keenauth.com/v1/organization-defaults" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "1"' \
  -d '{"on_org_delete_members":"delete_exclusive_provisioned","invitation_ttl_days":9}'
```

```bash
keenauth organization-defaults update --if-match '"1"' \
  --on-org-delete-members delete_exclusive_provisioned --invitation-ttl-days 9
```
