{
  "openapi": "3.1.0",
  "info": {
    "title": "ELOIMA API",
    "version": "1.0.0",
    "description": "Spécification OpenAPI officielle de l'API REST ELOIMA (Laravel 12 / PostgreSQL 16 / Redis 7). Couvre le site public, la billetterie avec QR Code, le scanner d'émargement et les modules d'administration du back-office.",
    "contact": {
      "name": "Équipe Technique ELOIMA",
      "email": "contact@eloima.fr",
      "url": "https://eloima.fr"
    }
  },
  "servers": [
    {
      "url": "https://api.eloima.fr",
      "description": "Serveur de Production"
    },
    {
      "url": "http://localhost:8000",
      "description": "Serveur de Développement Local"
    }
  ],
  "tags": [
    { "name": "Healthcheck", "description": "Surveillance et disponibilité de l'API" },
    { "name": "Authentification", "description": "Connexion et gestion des sessions admin" },
    { "name": "Services", "description": "Expertises et offres de l'ESN ELOIMA" },
    { "name": "Événements & Colloques", "description": "Programmation, intervenants, vidéos et avis" },
    { "name": "Billetterie & Inscriptions", "description": "Inscriptions en ligne et émission de billets PDF avec QR Code" },
    { "name": "Émargement & Contrôle", "description": "Scan et validation des billets à l'accueil" },
    { "name": "Actualités & CMS", "description": "Articles, analyses et publications" },
    { "name": "Contacts & CRM", "description": "Formulaires de contact, devis et suivi des leads" },
    { "name": "Configuration du Site", "description": "Réglages dynamiques (logo, réseaux, modules, hero d'accueil)" },
    { "name": "Administration - Dashboard", "description": "Statistiques et exports d'émargement" },
    { "name": "Administration - Événements", "description": "Gestion CRUD des colloques, vidéos, modération et sessions" },
    { "name": "Administration - Inscrits", "description": "Gestion globale des participants" },
    { "name": "Administration - Médiathèque", "description": "Téléversement et gestion des médias et bannières" },
    { "name": "Administration - Utilisateurs", "description": "Comptes de l'équipe et attribution des rôles" },
    { "name": "Administration - Profil", "description": "Gestion du compte connecté" }
  ],
  "components": {
    "securitySchemes": {
      "BearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "Token",
        "description": "Jeton de session retourné par `POST /api/v1/auth/login`"
      },
      "UserIdHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "X-User-Id",
        "description": "ID de l'utilisateur connecté"
      }
    },
    "schemas": {
      "ApiResponse": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "success" },
          "message": { "type": "string", "example": "Opération effectuée avec succès." }
        },
        "required": ["status"]
      },
      "ApiError": {
        "type": "object",
        "properties": {
          "status": { "type": "string", "example": "error" },
          "message": { "type": "string", "example": "Description de l'erreur." },
          "errors": { "type": "object" }
        },
        "required": ["status", "message"]
      },
      "Service": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "example": 1 },
          "slug": { "type": "string", "example": "developpement-logiciel" },
          "title": { "type": "string", "example": "Développement logiciel" },
          "subtitle": { "type": "string", "example": "Concevoir des solutions robustes" },
          "description": { "type": "string", "example": "Applications web et mobiles, architectures modernes..." },
          "icon": { "type": "string", "example": "code" },
          "features": { "type": "array", "items": { "type": "string" } },
          "display_order": { "type": "integer", "example": 1 },
          "is_active": { "type": "boolean", "example": true }
        }
      },
      "Event": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "example": 1 },
          "slug": { "type": "string", "example": "colloque-digitalisation-ia" },
          "title": { "type": "string", "example": "Colloque ELOIMA : Digitalisation & IA 2026" },
          "subtitle": { "type": "string", "example": "Accélérer l'innovation dans les entreprises" },
          "description": { "type": "string", "example": "Une journée d'échanges avec les experts du secteur." },
          "start_date": { "type": "string", "format": "date-time", "example": "2026-11-14T09:00:00Z" },
          "end_date": { "type": "string", "format": "date-time", "example": "2026-11-14T18:00:00Z" },
          "location_name": { "type": "string", "example": "Centre de Conférences Étoile" },
          "location_address": { "type": "string", "example": "Paris, France" },
          "is_featured": { "type": "boolean", "example": true },
          "is_published": { "type": "boolean", "example": true },
          "cover_url": { "type": "string", "nullable": true },
          "hero_background_url": { "type": "string", "nullable": true },
          "total_seats": { "type": "integer", "example": 300 },
          "remaining_seats": { "type": "integer", "example": 85 }
        }
      },
      "RegistrationRequest": {
        "type": "object",
        "required": ["first_name", "last_name", "email", "country", "profile_type", "privacy_accepted"],
        "properties": {
          "event_slug": { "type": "string", "example": "colloque-digitalisation-ia" },
          "civility": { "type": "string", "enum": ["M.", "Mme"], "example": "Mme" },
          "first_name": { "type": "string", "example": "Claire" },
          "last_name": { "type": "string", "example": "Lefebvre" },
          "email": { "type": "string", "format": "email", "example": "claire.lefebvre@example.com" },
          "phone": { "type": "string", "example": "+33 6 12 34 56 78" },
          "organization": { "type": "string", "example": "Banque de France" },
          "job_title": { "type": "string", "example": "Directrice Innovation" },
          "country": { "type": "string", "example": "France" },
          "profile_type": { "type": "string", "example": "Professionnel" },
          "accessibility_needs": { "type": "string", "nullable": true },
          "privacy_accepted": { "type": "boolean", "example": true },
          "opt_in_marketing": { "type": "boolean", "example": false },
          "company_website": { "type": "string", "description": "Champ Honeypot anti-spam (laisser vide)" }
        }
      },
      "CheckInScanRequest": {
        "type": "object",
        "required": ["barcode"],
        "properties": {
          "barcode": { "type": "string", "example": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" }
        }
      },
      "LeadRequest": {
        "type": "object",
        "required": ["name", "email", "message"],
        "properties": {
          "name": { "type": "string", "example": "Marc Dubois" },
          "email": { "type": "string", "format": "email", "example": "m.dubois@entreprise.com" },
          "phone": { "type": "string", "example": "+33 1 40 50 60 70" },
          "organization": { "type": "string", "example": "Logistique SA" },
          "type": { "type": "string", "enum": ["contact", "devis", "audit", "formation", "partenariat"], "example": "devis" },
          "message": { "type": "string", "example": "Demande de chiffrage pour un audit de migration cloud." },
          "company_website": { "type": "string", "description": "Champ Honeypot anti-spam (laisser vide)" }
        }
      },
      "Article": {
        "type": "object",
        "properties": {
          "id": { "type": "integer", "example": 1 },
          "title": { "type": "string", "example": "L'Impact de l'IA Générative dans le Cloud" },
          "slug": { "type": "string", "example": "impact-ia-generative-cloud" },
          "excerpt": { "type": "string", "example": "Analyse des nouvelles architectures serveur intégrant des LLM." },
          "content": { "type": "string" },
          "category": { "type": "string", "example": "Intelligence Artificielle" },
          "image_url": { "type": "string", "nullable": true },
          "author": { "type": "string", "example": "Consultant Cloud ELOIMA" },
          "is_published": { "type": "boolean", "example": true },
          "published_at": { "type": "string", "format": "date-time" }
        }
      }
    }
  },
  "paths": {
    "/up": {
      "get": {
        "tags": ["Healthcheck"],
        "summary": "Healthcheck système Laravel",
        "description": "Vérifie que le framework Laravel est initialisé et opérationnel.",
        "responses": {
          "200": { "description": "Application saine et disponible" }
        }
      }
    },
    "/api/v1/auth/login": {
      "post": {
        "tags": ["Authentification"],
        "summary": "Connexion administrateur",
        "description": "Authentifie un utilisateur et retourne son token de session ainsi que ses rôles.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["email", "password"],
                "properties": {
                  "email": { "type": "string", "format": "email", "example": "admin@eloima.fr" },
                  "password": { "type": "string", "format": "password", "example": "password" }
                }
              }
            }
          }
        },
        "responses": {
          "200": { "description": "Authentification réussie" },
          "401": { "description": "Identifiants invalides" },
          "422": { "description": "Données manquantes" },
          "429": { "description": "Trop de tentatives (limité à 5 / min)" }
        }
      }
    },
    "/api/v1/services": {
      "get": {
        "tags": ["Services"],
        "summary": "Liste des expertises et offres ELOIMA",
        "description": "Retourne les expertises publiées affichées sur la page d'accueil et la page Expertises.",
        "responses": {
          "200": {
            "description": "Liste des expertises",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": { "type": "string", "example": "success" },
                    "data": { "type": "array", "items": { "$ref": "#/components/schemas/Service" } }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/events": {
      "get": {
        "tags": ["Événements & Colloques"],
        "summary": "Liste de tous les événements publiés",
        "parameters": [
          { "name": "status", "in": "query", "schema": { "type": "string", "enum": ["upcoming", "past"] }, "description": "Filtrer les événements à venir ou passés" },
          { "name": "featured", "in": "query", "schema": { "type": "boolean" }, "description": "Filtrer uniquement l'événement vedette" }
        ],
        "responses": {
          "200": { "description": "Liste des événements filtrés" }
        }
      }
    },
    "/api/v1/events/{slug}": {
      "get": {
        "tags": ["Événements & Colloques"],
        "summary": "Détails complets d'un événement par son slug",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" }, "example": "colloque-digitalisation-ia" }
        ],
        "responses": {
          "200": { "description": "Détails de l'événement avec intervenants, sessions, vidéos et avis approuvés" },
          "404": { "description": "Événement introuvable" }
        }
      }
    },
    "/api/v1/event": {
      "get": {
        "tags": ["Événements & Colloques"],
        "summary": "Événement vedette ou par paramètre ?slug=",
        "parameters": [
          { "name": "slug", "in": "query", "schema": { "type": "string" }, "description": "Slug spécifique optionnel" }
        ],
        "responses": {
          "200": { "description": "Événement en vedette avec sessions et intervenants" }
        }
      }
    },
    "/api/v1/events/{idOrSlug}/comments": {
      "post": {
        "tags": ["Événements & Colloques"],
        "summary": "Déposer un avis ou commentaire public sur un événement",
        "parameters": [
          { "name": "idOrSlug", "in": "path", "required": true, "schema": { "type": "string" }, "example": "colloque-digitalisation-ia" }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["author_name", "content"],
                "properties": {
                  "author_name": { "type": "string", "example": "Sophie Martin" },
                  "author_role": { "type": "string", "example": "Directrice IT" },
                  "author_organization": { "type": "string", "example": "Tech Fin Europe" },
                  "content": { "type": "string", "example": "Excellente organisation et intervenants de haut niveau." },
                  "rating": { "type": "integer", "minimum": 1, "maximum": 5, "example": 5 },
                  "company_website": { "type": "string", "description": "Honeypot" }
                }
              }
            }
          }
        },
        "responses": {
          "201": { "description": "Avis enregistré (en attente de modération admin)" },
          "422": { "description": "Erreur de validation" }
        }
      }
    },
    "/api/v1/event/register": {
      "post": {
        "tags": ["Billetterie & Inscriptions"],
        "summary": "Inscription à un événement & émission du billet",
        "description": "Crée l'inscription, réserve une place, génère le QR Code opaque et le billet PDF téléchargeable.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/RegistrationRequest" }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Inscription validée et billet généré",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": { "type": "string", "example": "success" },
                    "data": {
                      "type": "object",
                      "properties": {
                        "ticket_number": { "type": "string", "example": "ELM-7D39A1F2" },
                        "barcode": { "type": "string", "example": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" },
                        "pdf_url": { "type": "string", "example": "https://api.eloima.fr/api/v1/tickets/uuid-ici/pdf" }
                      }
                    }
                  }
                }
              }
            }
          },
          "400": { "description": "Capacité maximale atteinte" },
          "409": { "description": "Participant déjà inscrit avec cet e-mail" },
          "422": { "description": "Validation échouée" }
        }
      }
    },
    "/api/v1/tickets/{uuid}/pdf": {
      "get": {
        "tags": ["Billetterie & Inscriptions"],
        "summary": "Téléchargement direct du billet PDF avec QR Code",
        "parameters": [
          { "name": "uuid", "in": "path", "required": true, "schema": { "type": "string", "format": "uuid" } }
        ],
        "responses": {
          "200": {
            "description": "Fichier PDF du billet officiel",
            "content": { "application/pdf": {} }
          },
          "404": { "description": "Billet introuvable" }
        }
      }
    },
    "/api/v1/check-in/scan": {
      "post": {
        "tags": ["Émargement & Contrôle"],
        "summary": "Scan et émargement en direct d'un billet QR Code",
        "description": "Valide l'entrée physique du participant à l'accueil via l'application ou douchette.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/CheckInScanRequest" }
            }
          }
        },
        "responses": {
          "200": { "description": "Billet validé avec succès (horodatage enregistré)" },
          "404": { "description": "Billet invalide ou inexistant" },
          "409": { "description": "Billet déjà scanné précédemment (alerte fraude)" }
        }
      }
    },
    "/api/v1/articles": {
      "get": {
        "tags": ["Actualités & CMS"],
        "summary": "Liste des articles d'actualités publiés",
        "responses": {
          "200": {
            "description": "Liste des articles",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "status": { "type": "string", "example": "success" },
                    "data": { "type": "array", "items": { "$ref": "#/components/schemas/Article" } }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/api/v1/articles/{slug}": {
      "get": {
        "tags": ["Actualités & CMS"],
        "summary": "Détails d'un article par son slug",
        "parameters": [
          { "name": "slug", "in": "path", "required": true, "schema": { "type": "string" } }
        ],
        "responses": {
          "200": { "description": "Article complet avec contenu HTML" },
          "404": { "description": "Article non trouvé" }
        }
      }
    },
    "/api/v1/leads": {
      "post": {
        "tags": ["Contacts & CRM"],
        "summary": "Formulaire de contact / Devis / Audit",
        "description": "Enregistre une nouvelle opportunité commerciale.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/LeadRequest" }
            }
          }
        },
        "responses": {
          "201": { "description": "Lead enregistré avec succès" },
          "422": { "description": "Erreur de validation" },
          "429": { "description": "Trop de requêtes" }
        }
      }
    },
    "/api/v1/settings": {
      "get": {
        "tags": ["Configuration du Site"],
        "summary": "Paramètres publics du site web",
        "description": "Retourne les métadonnées globales, réseaux sociaux, modules activés et configuration du hero d'accueil.",
        "responses": {
          "200": { "description": "Configuration publique active" }
        }
      }
    },
    "/api/v1/admin/dashboard": {
      "get": {
        "tags": ["Administration - Dashboard"],
        "summary": "Statistiques et KPIs en temps réel",
        "security": [{ "BearerAuth": [] }],
        "responses": {
          "200": { "description": "KPIs (leads, inscrits, événements, présences)" }
        }
      }
    },
    "/api/v1/admin/participants/export": {
      "get": {
        "tags": ["Administration - Dashboard"],
        "summary": "Export CSV d'émargement compatible Excel",
        "security": [{ "BearerAuth": [] }],
        "parameters": [
          { "name": "event_id", "in": "query", "schema": { "type": "integer" }, "description": "ID de l'événement à exporter (tous si omis)" }
        ],
        "responses": {
          "200": {
            "description": "Fichier CSV UTF-8",
            "content": { "text/csv": {} }
          }
        }
      }
    },
    "/api/v1/admin/events": {
      "get": {
        "tags": ["Administration - Événements"],
        "summary": "Liste de gestion des événements",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Liste complète des événements avec statistiques" } }
      },
      "post": {
        "tags": ["Administration - Événements"],
        "summary": "Créer un nouvel événement",
        "security": [{ "BearerAuth": [] }],
        "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Event" } } } },
        "responses": { "201": { "description": "Événement créé" } }
      }
    },
    "/api/v1/admin/events/{id}": {
      "get": {
        "tags": ["Administration - Événements"],
        "summary": "Détails d'un événement pour édition",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Données complètes de l'événement" } }
      },
      "patch": {
        "tags": ["Administration - Événements"],
        "summary": "Mettre à jour un événement (infos, quota, hero_background_url)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Événement mis à jour" } }
      },
      "delete": {
        "tags": ["Administration - Événements"],
        "summary": "Supprimer un événement",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Événement et dépendances supprimés" } }
      }
    },
    "/api/v1/admin/events/{id}/feature": {
      "patch": {
        "tags": ["Administration - Événements"],
        "summary": "Activer cet événement comme l'événement vedette",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Événement vedette mis à jour" } }
      }
    },
    "/api/v1/admin/events/{id}/registrations": {
      "get": {
        "tags": ["Administration - Événements"],
        "summary": "Inscrits d'un événement spécifique avec état d'émargement",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Liste des inscrits de cet événement" } }
      }
    },
    "/api/v1/admin/events/{id}/videos": {
      "get": {
        "tags": ["Administration - Événements"],
        "summary": "Vidéos associées à un événement",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Liste des vidéos" } }
      },
      "post": {
        "tags": ["Administration - Événements"],
        "summary": "Ajouter une vidéo (YouTube / lien)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["title", "video_url"],
                "properties": {
                  "title": { "type": "string", "example": "Keynote d'ouverture : L'IA en 2026" },
                  "video_url": { "type": "string", "example": "https://www.youtube.com/watch?v=dQw4w9WgXcQ" },
                  "duration": { "type": "string", "example": "45 min" },
                  "display_order": { "type": "integer", "example": 1 }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Vidéo ajoutée" } }
      }
    },
    "/api/v1/admin/events/{id}/comments": {
      "get": {
        "tags": ["Administration - Événements"],
        "summary": "Liste de tous les avis soumis avec statut d'approbation",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Liste des avis" } }
      }
    },
    "/api/v1/admin/comments/{id}/toggle-approval": {
      "patch": {
        "tags": ["Administration - Événements"],
        "summary": "Approuver ou masquer un avis participant",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Statut d'approbation inversé" } }
      }
    },
    "/api/v1/admin/registrations": {
      "get": {
        "tags": ["Administration - Inscrits"],
        "summary": "Liste globale des participants inscrits",
        "security": [{ "BearerAuth": [] }],
        "parameters": [
          { "name": "search", "in": "query", "schema": { "type": "string" }, "description": "Recherche par nom, prénom, organisation ou e-mail" },
          { "name": "checked_in", "in": "query", "schema": { "type": "boolean" }, "description": "Filtrer selon émargement" }
        ],
        "responses": { "200": { "description": "Liste paginée des inscriptions" } }
      }
    },
    "/api/v1/admin/leads": {
      "get": {
        "tags": ["Contacts & CRM"],
        "summary": "Liste des leads et contacts reçus",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Liste des prospects" } }
      }
    },
    "/api/v1/admin/leads/{id}": {
      "patch": {
        "tags": ["Contacts & CRM"],
        "summary": "Mettre à jour le statut d'un lead (new, in_progress, closed)",
        "security": [{ "BearerAuth": [] }],
        "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "integer" } }],
        "responses": { "200": { "description": "Lead mis à jour" } }
      }
    },
    "/api/v1/admin/media": {
      "get": {
        "tags": ["Administration - Médiathèque"],
        "summary": "Explorateur de fichiers de la médiathèque",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Liste des fichiers téléversés" } },
        "delete": {
          "tags": ["Administration - Médiathèque"],
          "summary": "Supprimer un fichier de la médiathèque",
          "security": [{ "BearerAuth": [] }],
          "requestBody": {
            "required": true,
            "content": { "application/json": { "schema": { "type": "object", "required": ["filename"], "properties": { "filename": { "type": "string" } } } } }
          },
          "responses": { "200": { "description": "Fichier supprimé" } }
        }
      }
    },
    "/api/v1/admin/media/upload": {
      "post": {
        "tags": ["Administration - Médiathèque"],
        "summary": "Téléverser une image ou document dans la médiathèque",
        "security": [{ "BearerAuth": [] }],
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "required": ["file"],
                "properties": {
                  "file": { "type": "string", "format": "binary", "description": "Fichier JPEG, PNG, WebP, SVG ou PDF jusqu'à 50 Mo" }
                }
              }
            }
          }
        },
        "responses": { "201": { "description": "Fichier enregistré avec succès et URL générée" } }
      }
    },
    "/api/v1/admin/roles": {
      "get": {
        "tags": ["Administration - Utilisateurs"],
        "summary": "Liste des rôles d'administration",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Liste des rôles et descriptions" } }
      }
    },
    "/api/v1/admin/users": {
      "get": {
        "tags": ["Administration - Utilisateurs"],
        "summary": "Liste des comptes administrateurs",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Liste des utilisateurs" } },
        "post": {
          "tags": ["Administration - Utilisateurs"],
          "summary": "Créer un nouvel utilisateur avec rôles",
          "security": [{ "BearerAuth": [] }],
          "responses": { "201": { "description": "Utilisateur créé" } }
        }
      }
    },
    "/api/v1/admin/profile": {
      "get": {
        "tags": ["Administration - Profil"],
        "summary": "Récupérer son profil utilisateur",
        "security": [{ "BearerAuth": [] }, { "UserIdHeader": [] }],
        "responses": { "200": { "description": "Données du profil" } },
        "patch": {
          "tags": ["Administration - Profil"],
          "summary": "Mettre à jour son profil et mot de passe",
          "security": [{ "BearerAuth": [] }, { "UserIdHeader": [] }],
          "responses": { "200": { "description": "Profil mis à jour" } }
        }
      }
    },
    "/api/v1/admin/settings": {
      "get": {
        "tags": ["Configuration du Site"],
        "summary": "Paramètres d'administration complets",
        "security": [{ "BearerAuth": [] }],
        "responses": { "200": { "description": "Tous les paramètres (général, social, modules, hero)" } },
        "patch": {
          "tags": ["Configuration du Site"],
          "summary": "Enregistrer les modifications de configuration",
          "security": [{ "BearerAuth": [] }],
          "responses": { "200": { "description": "Paramètres mis à jour" } }
        }
      }
    }
  }
}

