{
  "openapi": "3.0.3",
  "info": {
    "title": "IliaCloud API",
    "description": "API publique REST pour gerer vos serveurs, monitors, certificats SSL, alertes et plus encore.\n\nAuthentification par cle API : `Authorization: Bearer iliacloud_xxx`\n\nGenerez votre cle dans [Parametres > API](https://app.iliacloud.com/settings?tab=api).",
    "version": "1.0.0",
    "contact": {
      "email": "contact@iliacloud.com",
      "url": "https://iliacloud.com"
    }
  },
  "servers": [
    {
      "url": "https://api.iliacloud.com/api/v1",
      "description": "Production"
    }
  ],
  "security": [
    { "ApiKeyAuth": [] }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "http",
        "scheme": "bearer",
        "description": "Cle API au format `iliacloud_xxx`. Generez-la dans Parametres > API."
      }
    },
    "parameters": {
      "XGroupId": {
        "name": "X-Group-Id",
        "in": "header",
        "required": false,
        "schema": { "type": "string", "format": "uuid" },
        "description": "ID du groupe actif. Sans ce header, mode global (owner voit tout). Avec, les donnees sont filtrees par le perimetre du groupe."
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": { "type": "string", "example": "NOT_FOUND" },
              "message": { "type": "string", "example": "Ressource introuvable." }
            }
          }
        }
      },
      "PaginationMeta": {
        "type": "object",
        "properties": {
          "page": { "type": "integer", "example": 1 },
          "per_page": { "type": "integer", "example": 20 },
          "total": { "type": "integer", "example": 42 }
        }
      },
      "Server": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "name": { "type": "string", "example": "prod-web-01" },
          "host": { "type": "string", "example": "192.168.1.10" },
          "port": { "type": "integer", "example": 22 },
          "ssh_user": { "type": "string", "example": "root" },
          "created_at": { "type": "string", "format": "date-time" }
        }
      },
      "Monitor": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "url": { "type": "string", "example": "https://example.com" },
          "label": { "type": "string", "example": "Mon site" },
          "interval_s": { "type": "integer", "example": 60 },
          "enabled": { "type": "boolean" },
          "last_status": { "type": "integer", "example": 200 },
          "last_latency": { "type": "integer", "example": 142 },
          "uptime_24h": { "type": "number", "example": 99.9 },
          "uptime_30d": { "type": "number", "example": 99.7 },
          "created_at": { "type": "string", "format": "date-time" }
        }
      },
      "SslCertificate": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "domain": { "type": "string", "example": "example.com" },
          "port": { "type": "integer", "example": 443 },
          "issuer": { "type": "string" },
          "valid_to": { "type": "string", "format": "date-time" },
          "days_remaining": { "type": "integer", "example": 45 },
          "last_status": { "type": "string", "enum": ["valid", "expiring", "expired", "error", "pending"] },
          "created_at": { "type": "string", "format": "date-time" }
        }
      },
      "AlertRule": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "server_id": { "type": "string", "format": "uuid" },
          "server_name": { "type": "string" },
          "metric": { "type": "string", "enum": ["cpu", "mem", "disk", "load", "container_down"] },
          "threshold": { "type": "integer", "example": 90 },
          "enabled": { "type": "boolean" },
          "created_at": { "type": "string", "format": "date-time" }
        }
      },
      "Group": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "name": { "type": "string", "example": "CoolCare" },
          "slug": { "type": "string", "example": "coolcare" },
          "description": { "type": "string" },
          "color": { "type": "string", "example": "#6366f1" },
          "role": { "type": "string", "enum": ["owner", "member"] },
          "member_count": { "type": "integer" },
          "server_count": { "type": "integer" },
          "server_ids": { "type": "array", "items": { "type": "string", "format": "uuid" } },
          "created_at": { "type": "string", "format": "date-time" }
        }
      },
      "GroupMember": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "user_id": { "type": "string", "format": "uuid" },
          "email": { "type": "string" },
          "permissions": { "type": "object" },
          "status": { "type": "string", "enum": ["active", "revoked"] },
          "joined_at": { "type": "string", "format": "date-time" }
        }
      },
      "GroupInvitation": {
        "type": "object",
        "properties": {
          "id": { "type": "string", "format": "uuid" },
          "email": { "type": "string" },
          "permissions": { "type": "object" },
          "send_count": { "type": "integer" },
          "expires_at": { "type": "string", "format": "date-time" },
          "created_at": { "type": "string", "format": "date-time" }
        }
      }
    }
  },
  "tags": [
    { "name": "Systeme", "description": "Endpoints systeme (health check)" },
    { "name": "Serveurs", "description": "Gestion des serveurs" },
    { "name": "Backups", "description": "Backups de bases de donnees" },
    { "name": "Uptime", "description": "Monitors uptime HTTP" },
    { "name": "SSL", "description": "Surveillance de certificats SSL" },
    { "name": "Alertes", "description": "Regles et historique d'alertes" },
    { "name": "Quick Actions", "description": "Actions rapides sur les serveurs" },
    { "name": "Annotations", "description": "Annotations sur les serveurs" },
    { "name": "Webhooks", "description": "Webhooks de notification" },
    { "name": "Status Pages", "description": "Pages de statut publiques" },
    { "name": "Compte", "description": "Profil et usage" },
    { "name": "Groupes", "description": "Gestion des groupes de partage d'acces, membres, invitations et docker targets" }
  ],
  "paths": {
    "/health": {
      "get": {
        "tags": ["Systeme"],
        "summary": "Health check API",
        "responses": { "200": { "description": "API operationnelle" } }
      }
    },
    "/servers": {
      "get": {
        "tags": ["Serveurs"],
        "summary": "Liste des serveurs",
        "description": "Le header X-Group-Id est disponible sur toutes les routes existantes (serveurs, monitors, SSL, alertes, etc.) pour filtrer par groupe.",
        "parameters": [
          { "$ref": "#/components/parameters/XGroupId" },
          { "name": "page", "in": "query", "schema": { "type": "integer", "default": 1 } },
          { "name": "per_page", "in": "query", "schema": { "type": "integer", "default": 20, "maximum": 100 } }
        ],
        "responses": { "200": { "description": "Liste paginee des serveurs" } }
      }
    },
    "/servers/{id}": {
      "get": {
        "tags": ["Serveurs"],
        "summary": "Detail d'un serveur",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Detail du serveur" }, "404": { "description": "Serveur introuvable" } }
      }
    },
    "/servers/{id}/metrics": {
      "get": {
        "tags": ["Serveurs"],
        "summary": "Historique des metriques",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "range", "in": "query", "schema": { "type": "string", "enum": ["1h", "6h", "24h", "7d", "30d"], "default": "24h" } }
        ],
        "responses": { "200": { "description": "Metriques historiques" } }
      }
    },
    "/servers/{id}/backups": {
      "get": {
        "tags": ["Backups"],
        "summary": "Liste des backups d'un serveur",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Liste paginee" } }
      },
      "post": {
        "tags": ["Backups"],
        "summary": "Declencher un backup manuel",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["label", "db_type", "db_name"],
                "properties": {
                  "label": { "type": "string" },
                  "db_type": { "type": "string", "enum": ["postgresql", "mysql"] },
                  "db_name": { "type": "string" },
                  "db_user": { "type": "string", "default": "root" },
                  "db_container": { "type": "string" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Backup declenche" } }
      }
    },
    "/monitors": {
      "get": {
        "tags": ["Uptime"],
        "summary": "Liste des monitors uptime",
        "parameters": [{ "$ref": "#/components/parameters/XGroupId" }],
        "responses": { "200": { "description": "Liste paginee avec uptime % et latence" } }
      },
      "post": {
        "tags": ["Uptime"],
        "summary": "Creer un monitor",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["url", "label"],
                "properties": {
                  "url": { "type": "string", "example": "https://example.com" },
                  "label": { "type": "string", "example": "Mon site" },
                  "interval_s": { "type": "integer", "default": 300, "description": "Intervalle en secondes (min selon plan)" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Monitor cree" } }
      }
    },
    "/monitors/{id}": {
      "get": {
        "tags": ["Uptime"],
        "summary": "Detail d'un monitor",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Detail avec uptime %" } }
      },
      "patch": {
        "tags": ["Uptime"],
        "summary": "Modifier un monitor",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "url": { "type": "string" },
                  "label": { "type": "string" },
                  "interval_s": { "type": "integer" },
                  "enabled": { "type": "boolean" }
                }
              }
            }
          }
        },
        "responses": { "200": { "description": "Monitor modifie" } }
      },
      "delete": {
        "tags": ["Uptime"],
        "summary": "Supprimer un monitor",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Monitor supprime" } }
      }
    },
    "/monitors/{id}/history": {
      "get": {
        "tags": ["Uptime"],
        "summary": "Historique des checks",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "range", "in": "query", "schema": { "type": "string", "enum": ["1h", "6h", "24h", "7d", "30d"], "default": "24h" } }
        ],
        "responses": { "200": { "description": "Liste des checks avec uptime % et latence moyenne" } }
      }
    },
    "/monitors/{id}/pause": {
      "post": {
        "tags": ["Uptime"],
        "summary": "Pauser/reprendre un monitor (toggle)",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Etat enabled inverse" } }
      }
    },
    "/ssl": {
      "get": {
        "tags": ["SSL"],
        "summary": "Liste des certificats surveilles",
        "parameters": [{ "$ref": "#/components/parameters/XGroupId" }],
        "responses": { "200": { "description": "Liste paginee avec days_remaining" } }
      },
      "post": {
        "tags": ["SSL"],
        "summary": "Ajouter un certificat a surveiller",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["domain"],
                "properties": {
                  "domain": { "type": "string", "example": "example.com" },
                  "port": { "type": "integer", "default": 443 },
                  "alert_days": { "type": "integer", "default": 30, "description": "Alerter X jours avant expiration" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Certificat ajoute" } }
      }
    },
    "/ssl/{id}": {
      "get": {
        "tags": ["SSL"],
        "summary": "Detail d'un certificat",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Detail avec days_remaining" } }
      },
      "delete": {
        "tags": ["SSL"],
        "summary": "Retirer un certificat",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Certificat retire" } }
      }
    },
    "/alerts/rules": {
      "get": {
        "tags": ["Alertes"],
        "summary": "Liste des regles d'alerte",
        "responses": { "200": { "description": "Liste des regles avec server_name" } }
      },
      "post": {
        "tags": ["Alertes"],
        "summary": "Creer/modifier une regle d'alerte (upsert)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["server_id", "metric"],
                "properties": {
                  "server_id": { "type": "string", "format": "uuid" },
                  "metric": { "type": "string", "enum": ["cpu", "mem", "disk", "load", "container_down"] },
                  "threshold": { "type": "integer", "default": 90 },
                  "enabled": { "type": "boolean", "default": true }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Regle creee/mise a jour" } }
      }
    },
    "/alerts/rules/{id}": {
      "patch": {
        "tags": ["Alertes"],
        "summary": "Modifier une regle",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Regle modifiee" } }
      },
      "delete": {
        "tags": ["Alertes"],
        "summary": "Supprimer une regle",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Regle supprimee" } }
      }
    },
    "/alerts/history": {
      "get": {
        "tags": ["Alertes"],
        "summary": "Historique des alertes declenchees",
        "responses": { "200": { "description": "Liste paginee" } }
      }
    },
    "/webhooks": {
      "get": {
        "tags": ["Webhooks"],
        "summary": "Liste des webhooks configures",
        "responses": { "200": { "description": "Liste des webhooks" } }
      }
    },
    "/webhooks/{id}/test": {
      "post": {
        "tags": ["Webhooks"],
        "summary": "Envoyer un payload de test",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Resultat de l'envoi" } }
      }
    },
    "/status-pages": {
      "get": {
        "tags": ["Status Pages"],
        "summary": "Liste des pages de statut",
        "responses": { "200": { "description": "Liste des pages" } }
      }
    },
    "/status-pages/{id}": {
      "patch": {
        "tags": ["Status Pages"],
        "summary": "Modifier une page de statut",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Page modifiee" } }
      }
    },
    "/me": {
      "get": {
        "tags": ["Compte"],
        "summary": "Profil utilisateur",
        "responses": { "200": { "description": "Email, plan, date de creation" } }
      }
    },
    "/me/usage": {
      "get": {
        "tags": ["Compte"],
        "summary": "Utilisation actuelle vs limites du plan",
        "responses": { "200": { "description": "Usage par ressource avec current/limit" } }
      }
    },
    "/me/rate-limit": {
      "get": {
        "tags": ["Compte"],
        "summary": "Usage rate limit API (requetes/heure)",
        "responses": { "200": { "description": "used, limit, remaining, reset_at" } }
      }
    },
    "/servers/{id}/backups/{backupId}/download": {
      "get": {
        "tags": ["Backups"],
        "summary": "Telecharger un backup (fichier SQL brut)",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "backupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Fichier SQL (Content-Type: application/sql)" }, "404": { "description": "Backup introuvable" } }
      }
    },
    "/servers/{id}/actions": {
      "get": {
        "tags": ["Quick Actions"],
        "summary": "Liste des actions rapides d'un serveur",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Liste des actions" } }
      }
    },
    "/servers/{id}/actions/{actionId}/run": {
      "post": {
        "tags": ["Quick Actions"],
        "summary": "Executer une action rapide",
        "description": "Si l'action necessite confirmation, renvoie 202 avec requires_confirm: true. Renvoyez avec { confirmed: true } pour executer.",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "actionId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "requestBody": { "content": { "application/json": { "schema": { "type": "object", "properties": { "confirmed": { "type": "boolean", "description": "Confirmer l'execution (si requires_confirm)" } } } } } },
        "responses": { "200": { "description": "Resultat : ok, stdout, stderr, exit_code" }, "202": { "description": "Confirmation requise" } }
      }
    },
    "/servers/{id}/annotations": {
      "get": {
        "tags": ["Annotations"],
        "summary": "Liste des annotations d'un serveur",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Liste des annotations" } }
      },
      "post": {
        "tags": ["Annotations"],
        "summary": "Creer une annotation (ex: deploiement, incident)",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["title"], "properties": { "title": { "type": "string", "maxLength": 200 }, "description": { "type": "string", "maxLength": 2000 }, "category": { "type": "string", "enum": ["deployment", "incident", "maintenance", "config", "other"] }, "timestamp": { "type": "string", "format": "date-time" } } } } } },
        "responses": { "201": { "description": "Annotation creee" } }
      }
    },
    "/servers/{id}/annotations/{annotId}": {
      "patch": {
        "tags": ["Annotations"],
        "summary": "Modifier une annotation",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "annotId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Annotation modifiee" } }
      },
      "delete": {
        "tags": ["Annotations"],
        "summary": "Supprimer une annotation",
        "parameters": [
          { "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "annotId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Annotation supprimee" } }
      }
    },
    "/webhooks": {
      "get": {
        "tags": ["Webhooks"],
        "summary": "Liste des webhooks configures",
        "responses": { "200": { "description": "Liste des webhooks" } }
      },
      "post": {
        "tags": ["Webhooks"],
        "summary": "Creer un webhook",
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "type": "object", "required": ["label", "url"], "properties": { "label": { "type": "string" }, "url": { "type": "string", "example": "https://discord.com/api/webhooks/..." }, "platform": { "type": "string", "enum": ["discord", "slack", "telegram", "custom"], "default": "discord" }, "events": { "type": "array", "items": { "type": "string" }, "description": "server_alert, uptime_down, uptime_up, backup_error, etc." } } } } } },
        "responses": { "201": { "description": "Webhook cree" } }
      }
    },
    "/webhooks/{id}": {
      "patch": {
        "tags": ["Webhooks"],
        "summary": "Modifier un webhook",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Webhook modifie" } }
      },
      "delete": {
        "tags": ["Webhooks"],
        "summary": "Supprimer un webhook",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Webhook supprime" } }
      }
    },
    "/webhooks/{id}/test": {
      "post": {
        "tags": ["Webhooks"],
        "summary": "Envoyer un payload de test",
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Resultat de l'envoi" } }
      }
    },
    "/groups": {
      "get": {
        "tags": ["Groupes"],
        "summary": "Lister ses groupes (owner + membre)",
        "responses": {
          "200": {
            "description": "Liste des groupes",
            "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Group" } } } }
          }
        }
      },
      "post": {
        "tags": ["Groupes"],
        "summary": "Creer un groupe",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "type": "object", "required": ["name"], "properties": { "name": { "type": "string", "example": "CoolCare" }, "description": { "type": "string" }, "color": { "type": "string", "example": "#6366f1" }, "server_ids": { "type": "array", "items": { "type": "string", "format": "uuid" } } } } } }
        },
        "responses": {
          "201": { "description": "Groupe cree", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } }
        }
      }
    },
    "/groups/{groupId}": {
      "get": {
        "tags": ["Groupes"],
        "summary": "Detail d'un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": {
          "200": { "description": "Detail du groupe", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } },
          "404": { "description": "Groupe introuvable" }
        }
      },
      "patch": {
        "tags": ["Groupes"],
        "summary": "Modifier un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "properties": { "name": { "type": "string" }, "description": { "type": "string" }, "color": { "type": "string" }, "server_ids": { "type": "array", "items": { "type": "string", "format": "uuid" } } } } } }
        },
        "responses": { "200": { "description": "Groupe modifie", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } } }
      },
      "delete": {
        "tags": ["Groupes"],
        "summary": "Supprimer un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Groupe supprime" } }
      }
    },
    "/groups/{groupId}/members": {
      "get": {
        "tags": ["Groupes"],
        "summary": "Lister les membres d'un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": {
          "200": { "description": "Liste des membres", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/GroupMember" } } } } }
        }
      }
    },
    "/groups/{groupId}/members/{memberId}": {
      "patch": {
        "tags": ["Groupes"],
        "summary": "Modifier les permissions d'un membre",
        "parameters": [
          { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "memberId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "requestBody": {
          "content": { "application/json": { "schema": { "type": "object", "properties": { "permissions": { "type": "object" } } } } }
        },
        "responses": { "200": { "description": "Permissions modifiees", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupMember" } } } } }
      },
      "delete": {
        "tags": ["Groupes"],
        "summary": "Revoquer un membre",
        "parameters": [
          { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "memberId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Membre revoque" } }
      }
    },
    "/groups/{groupId}/invitations": {
      "get": {
        "tags": ["Groupes"],
        "summary": "Lister les invitations d'un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": {
          "200": { "description": "Liste des invitations", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/GroupInvitation" } } } } }
        }
      },
      "post": {
        "tags": ["Groupes"],
        "summary": "Inviter un utilisateur (email ou ajout direct)",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "type": "object", "required": ["email"], "properties": { "email": { "type": "string" }, "permissions": { "type": "object" } } } } }
        },
        "responses": { "201": { "description": "Invitation envoyee", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupInvitation" } } } } }
      }
    },
    "/groups/{groupId}/invitations/{invitationId}": {
      "delete": {
        "tags": ["Groupes"],
        "summary": "Revoquer une invitation",
        "parameters": [
          { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "invitationId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Invitation revoquee" } }
      }
    },
    "/groups/{groupId}/invitations/{invitationId}/resend": {
      "post": {
        "tags": ["Groupes"],
        "summary": "Renvoyer une invitation",
        "parameters": [
          { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "invitationId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Invitation renvoyee" } }
      }
    },
    "/groups/{groupId}/docker-targets": {
      "get": {
        "tags": ["Groupes"],
        "summary": "Lister les docker targets d'un groupe",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "responses": { "200": { "description": "Liste des docker targets" } }
      },
      "post": {
        "tags": ["Groupes"],
        "summary": "Ajouter un docker target",
        "parameters": [{ "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "type": "object", "required": ["server_id"], "properties": { "server_id": { "type": "string", "format": "uuid" } } } } }
        },
        "responses": { "201": { "description": "Docker target ajoute" } }
      }
    },
    "/groups/{groupId}/docker-targets/{targetId}": {
      "delete": {
        "tags": ["Groupes"],
        "summary": "Supprimer un docker target",
        "parameters": [
          { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } },
          { "name": "targetId", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": { "200": { "description": "Docker target supprime" } }
      }
    }
  }
}
