openapi: 3.0.3
info:
  title: 'Laravel API Documentation'
  description: ''
  version: 1.0.0
servers:
  -
    url: 'https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app'
tags:
  -
    name: Commandes
    description: ''
  -
    name: Contact
    description: ''
  -
    name: Endpoints
    description: ''
paths:
  /api/commandes:
    post:
      summary: 'Stocke une nouvelle commande avec ses personnalisations et paiement.'
      operationId: stockeUneNouvelleCommandeAvecSesPersonnalisationsEtPaiement
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "{\n  \"message\": \"Commande traitée avec succès\",\n  \"commande_id\": 123,\n  \"commande\": {\n    \"N_COMMANDE\": 123,\n    \"N_COMPTE\": \"456\",\n    ...\n  }\n}"
        401:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  error: 'Utilisateur non authentifié'
                properties:
                  error:
                    type: string
                    example: 'Utilisateur non authentifié'
        500:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  error: 'Erreur lors de la création de la commande'
                  message: "Détails de l'erreur"
                properties:
                  error:
                    type: string
                    example: 'Erreur lors de la création de la commande'
                  message:
                    type: string
                    example: "Détails de l'erreur"
      tags:
        - Commandes
      requestBody:
        required: false
        content:
          application/json:
            schema:
              type: object
              properties:
                elementColors:
                  type: array|null
                  description: 'Couleurs sélectionnées pour personnalisation. Exemple: {"fond":["Cyan","Noir"],"textePrincipal":["Jaune"]}'
                  example: consequatur
                  nullable: false
                colorChange:
                  type: string
                  description: 'Indique si changement de couleur est activé ("Oui" ou "Non").'
                  example: consequatur
                  nullable: false
                logo:
                  type: boolean
                  description: 'Indique si un logo est demandé (true/false).'
                  example: false
                  nullable: false
                remarque:
                  type: string|null
                  description: 'Commentaires supplémentaires.'
                  example: consequatur
                  nullable: false
                total:
                  type: number
                  description: 'Prix total de la commande.'
                  example: 11613.31890586
                  nullable: false
                product:
                  type: object|null
                  description: 'Objet produit avec propriété `name`.'
                  example: consequatur
                  nullable: false
                quantity:
                  type: integer
                  description: 'Quantité commandée.'
                  example: 17
                  nullable: false
                eyeletColor:
                  type: string
                  description: "Couleur de l'œillet."
                  example: consequatur
                  nullable: false
                notchedDial:
                  type: string
                  description: 'Indique si cadran cranté ("Oui" ou "Non").'
                  example: consequatur
                  nullable: false
                pvcCase:
                  type: string
                  description: 'Indique si étui PVC est demandé ("Oui" ou "Non").'
                  example: consequatur
                  nullable: false
                reverseSide:
                  type: string
                  description: 'Type de verso ("Euro" ou autre).'
                  example: consequatur
                  nullable: false
      security: []
  /api/contact:
    post:
      summary: 'Envoie un email via le formulaire de contact.'
      operationId: envoieUnEmailViaLeFormulaireDeContact
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'Email envoyé avec succès'
                properties:
                  message:
                    type: string
                    example: 'Email envoyé avec succès'
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  message: 'The given data was invalid.'
                  errors:
                    email:
                      - 'The email must be a valid email address.'
                    name:
                      - 'The name field is required.'
                properties:
                  message:
                    type: string
                    example: 'The given data was invalid.'
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'The email must be a valid email address.'
                        items:
                          type: string
                      name:
                        type: array
                        example:
                          - 'The name field is required.'
                        items:
                          type: string
        500:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  error: "Erreur lors de l'envoi de l'email"
                  message: "Détails de l'erreur"
                properties:
                  error:
                    type: string
                    example: "Erreur lors de l'envoi de l'email"
                  message:
                    type: string
                    example: "Détails de l'erreur"
      tags:
        - Contact
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  description: 'Nom de la personne qui contacte. Exemple: "Jean Dupont"'
                  example: consequatur
                  nullable: false
                email:
                  type: string
                  description: 'Email valide de l''expéditeur. Exemple: "jean.dupont@example.com"'
                  example: qkunze@example.com
                  nullable: false
                subject:
                  type: string
                  description: 'Sujet du message. Exemple: "Demande d''information"'
                  example: consequatur
                  nullable: false
                message:
                  type: string
                  description: 'Contenu du message. Exemple: "Bonjour, je souhaite obtenir plus de détails..."'
                  example: consequatur
                  nullable: false
              required:
                - name
                - email
                - subject
                - message
      security: []
  /api/login:
    post:
      summary: "Authentification de l'utilisateur via API."
      operationId: authentificationDeLutilisateurViaAPI
      description: "Valide les données reçues, vérifie les identifiants, génère un token d'authentification\net renvoie les informations client avec le token."
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address. Must not be greater than 255 characters.'
                  example: qkunze@example.com
                  nullable: false
                password:
                  type: string
                  description: 'Must be at least 8 characters.'
                  example: 'Z5ij-e/dl4m{o,'
                  nullable: false
              required:
                - email
                - password
      security: []
  /api/inscription:
    post:
      summary: 'Enregistre une nouvelle inscription client avec validation des données, création en base, et envoi de mail de vérification.'
      operationId: enregistreUneNouvelleInscriptionClientAvecValidationDesDonnesCrationEnBaseEtEnvoiDeMailDeVrification
      description: ''
      parameters: []
      responses:
        201:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: success
                  message: 'Inscription réussie. Un email de vérification a été envoyé à email@example.com'
                  client:
                    id: 123
                    email: email@example.com
                    name: 'Prénom Nom'
                properties:
                  status:
                    type: string
                    example: success
                  message:
                    type: string
                    example: 'Inscription réussie. Un email de vérification a été envoyé à email@example.com'
                  client:
                    type: object
                    properties:
                      id:
                        type: integer
                        example: 123
                      email:
                        type: string
                        example: email@example.com
                      name:
                        type: string
                        example: 'Prénom Nom'
        422:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: error
                  errors:
                    email:
                      - 'Cet email est déjà utilisé.'
                    motpasse_client:
                      - 'La confirmation du mot de passe ne correspond pas.'
                properties:
                  status:
                    type: string
                    example: error
                  errors:
                    type: object
                    properties:
                      email:
                        type: array
                        example:
                          - 'Cet email est déjà utilisé.'
                        items:
                          type: string
                      motpasse_client:
                        type: array
                        example:
                          - 'La confirmation du mot de passe ne correspond pas.'
                        items:
                          type: string
        500:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: error
                  message: "Erreur lors de l'inscription"
                  error: "Détails de l'erreur"
                properties:
                  status:
                    type: string
                    example: error
                  message:
                    type: string
                    example: "Erreur lors de l'inscription"
                  error:
                    type: string
                    example: "Détails de l'erreur"
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                type_client:
                  type: string
                  description: 'Type de client ("PARTICULIER", "ENTREPRISE", "REVENDEUR").'
                  example: consequatur
                  nullable: false
                nom_client:
                  type: string
                  description: 'Nom du client.'
                  example: consequatur
                  nullable: false
                prenom_client:
                  type: string
                  description: 'Prénom du client.'
                  example: consequatur
                  nullable: false
                email:
                  type: string
                  description: 'Email valide et unique.'
                  example: qkunze@example.com
                  nullable: false
                tele:
                  type: string
                  description: Téléphone.
                  example: consequatur
                  nullable: false
                motpasse_client:
                  type: string
                  description: 'Mot de passe (minimum 8 caractères) avec confirmation.'
                  example: consequatur
                  nullable: false
                ville:
                  type: string
                  description: Ville.
                  example: consequatur
                  nullable: false
                code_postal:
                  type: string
                  description: 'Code postal.'
                  example: consequatur
                  nullable: false
                pays:
                  type: string
                  description: Pays.
                  example: consequatur
                  nullable: false
                nom_rue:
                  type: string
                  description: 'Nom de la rue.'
                  example: consequatur
                  nullable: false
                motpasse_client_confirmation:
                  type: string
                  description: 'Confirmation du mot de passe.'
                  example: consequatur
                  nullable: false
                numero_rue:
                  type: int|null
                  description: 'Numéro de la rue.'
                  example: consequatur
                  nullable: false
                complement:
                  type: string|null
                  description: "Complément d'adresse."
                  example: consequatur
                  nullable: false
                sex:
                  type: string|null
                  description: 'Sexe ("M" ou "F"), défaut "M".'
                  example: consequatur
                  nullable: false
                societe:
                  type: string|null
                  description: 'Société (pour entreprises).'
                  example: consequatur
                  nullable: false
                n_tva:
                  type: string|null
                  description: 'Numéro de TVA.'
                  example: consequatur
                  nullable: false
                service:
                  type: string|null
                  description: Service.
                  example: consequatur
                  nullable: false
                site_web:
                  type: string|null
                  description: 'Site web.'
                  example: consequatur
                  nullable: false
              required:
                - type_client
                - nom_client
                - prenom_client
                - email
                - tele
                - motpasse_client
                - ville
                - code_postal
                - pays
                - nom_rue
                - motpasse_client_confirmation
      security: []
  /api/send-verification-email:
    post:
      summary: "Envoi d'un email de vérification à un client."
      operationId: envoiDunEmailDeVrificationUnClient
      description: "Cette méthode valide l'email fourni dans la requête, vérifie que\nl'email existe bien dans la table `client`. Si le client n'a pas encore\nde token de vérification, elle en génère un nouveau.\nEnsuite, elle envoie un email de vérification à cette adresse."
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                email:
                  type: string
                  description: 'Must be a valid email address. The <code>email</code> of an existing record in the client table.'
                  example: qkunze@example.com
                  nullable: false
              required:
                - email
      security: []
  '/api/verify-email/{token}':
    get:
      summary: "Vérifie le token de validation d'email et active le compte utilisateur."
      operationId: vrifieLeTokenDeValidationDemailEtActiveLeCompteUtilisateur
      description: ''
      parameters: []
      responses:
        200:
          description: ''
          content:
            application/json:
              schema:
                oneOf:
                  -
                    description: ''
                    type: object
                    example:
                      status: success
                      message: 'Email vérifié avec succès !'
                      client:
                        n_compte: 123
                        email: email@example.com
                        email_verified_at: '2025-05-17T14:00:00Z'
                    properties:
                      status:
                        type: string
                        example: success
                      message:
                        type: string
                        example: 'Email vérifié avec succès !'
                      client:
                        type: object
                        properties:
                          n_compte:
                            type: integer
                            example: 123
                          email:
                            type: string
                            example: email@example.com
                          email_verified_at:
                            type: string
                            example: '2025-05-17T14:00:00Z'
                  -
                    description: ''
                    type: object
                    example:
                      status: info
                      message: 'Votre email a déjà été vérifié'
                    properties:
                      status:
                        type: string
                        example: info
                      message:
                        type: string
                        example: 'Votre email a déjà été vérifié'
        404:
          description: ''
          content:
            application/json:
              schema:
                type: object
                example:
                  status: error
                  message: 'Lien de vérification invalide ou expiré'
                properties:
                  status:
                    type: string
                    example: error
                  message:
                    type: string
                    example: 'Lien de vérification invalide ou expiré'
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: token
        description: 'Token unique de vérification envoyé par email.'
        example: consequatur
        required: true
        schema:
          type: string
  /api/client:
    get:
      summary: ''
      operationId: getApiClient
      description: ''
      parameters: []
      responses:
        302:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;url='https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login'\" />\n\n        <title>Redirecting to https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</title>\n    </head>\n    <body>\n        Redirecting to <a href=\"https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login\">https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</a>.\n    </body>\n</html>"
      tags:
        - Endpoints
      security: []
  /api/user:
    get:
      summary: ''
      operationId: getApiUser
      description: ''
      parameters: []
      responses:
        302:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;url='https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login'\" />\n\n        <title>Redirecting to https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</title>\n    </head>\n    <body>\n        Redirecting to <a href=\"https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login\">https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</a>.\n    </body>\n</html>"
      tags:
        - Endpoints
      security: []
  /api/logout:
    post:
      summary: "Déconnexion de l'utilisateur."
      operationId: dconnexionDeLutilisateur
      description: "Révoque tous les tokens d'authentification pour l'utilisateur connecté."
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      security: []
  /api/personnalisations:
    post:
      summary: 'Créer une nouvelle personnalisation à partir des données reçues en POST.'
      operationId: crerUneNouvellePersonnalisationPartirDesDonnesReuesEnPOST
      description: "Cette méthode reçoit les paramètres de personnalisation d'une commande,\ninitialise les valeurs par défaut, met à jour les valeurs selon les entrées,\npuis crée un enregistrement en base de données."
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      security: []
  /api/payment:
    post:
      summary: 'Crée un paiement avec PayPlug et enregistre les informations dans la base.'
      operationId: creUnPaiementAvecPayPlugEtEnregistreLesInformationsDansLaBase
      description: ''
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      security: []
  /api/debug/auth-test:
    get:
      summary: ''
      operationId: getApiDebugAuthTest
      description: ''
      parameters: []
      responses:
        302:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;url='https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login'\" />\n\n        <title>Redirecting to https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</title>\n    </head>\n    <body>\n        Redirecting to <a href=\"https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login\">https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</a>.\n    </body>\n</html>"
      tags:
        - Endpoints
      security: []
  /api/debug/auth-verify:
    get:
      summary: ''
      operationId: getApiDebugAuthVerify
      description: ''
      parameters: []
      responses:
        302:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n    <head>\n        <meta charset=\"UTF-8\" />\n        <meta http-equiv=\"refresh\" content=\"0;url='https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login'\" />\n\n        <title>Redirecting to https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</title>\n    </head>\n    <body>\n        Redirecting to <a href=\"https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login\">https://5148-2a01-e0a-5f1-2ae0-b88b-4285-8880-7e0a.ngrok-free.app/login</a>.\n    </body>\n</html>"
      tags:
        - Endpoints
      security: []
  /api/payment/webhook:
    post:
      summary: 'Traitement des notifications webhook envoyées par PayPlug.'
      operationId: traitementDesNotificationsWebhookEnvoyesParPayPlug
      description: 'Met à jour le statut du paiement en fonction de la notification reçue.'
      parameters: []
      responses: {  }
      tags:
        - Endpoints
      security: []
  '/api/payment/success/{payment}':
    get:
      summary: 'Gère la redirection après paiement réussi.'
      operationId: greLaRedirectionAprsPaiementRussi
      description: 'Met à jour le statut du paiement et de la commande dans la base.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n<head>\n    <title>Paiement réussi</title>\n    <meta http-equiv=\"refresh\" content=\"3;url=http://localhost:3000/\" />\n</head>\n<body style=\"text-align: center; padding: 50px; font-family: Arial;\">\n    <h1>Paiement réussi !</h1>\n    <p>Vous allez être redirigé vers la page d'accueil dans quelques instants...</p>\n    <p>Si ce n'est pas le cas, <a href=\"http://localhost:3000/\">cliquez ici</a>.</p>\n</body>\n</html>"
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: payment
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
  '/api/payment/cancel/{payment}':
    get:
      summary: 'Gère la redirection après annulation du paiement.'
      operationId: greLaRedirectionAprsAnnulationDuPaiement
      description: 'Met à jour le statut du paiement en échec.'
      parameters: []
      responses:
        200:
          description: ''
          content:
            text/plain:
              schema:
                type: string
                example: "<!DOCTYPE html>\n<html>\n<head>\n    <title>Paiement annulé</title>\n    <meta http-equiv=\"refresh\" content=\"3;url=http://localhost:3000/order?error=payment_cancelled\" />\n</head>\n<body style=\"text-align: center; padding: 50px; font-family: Arial;\">\n    <h1>❌ Paiement annulé</h1>\n    <p>Vous allez être redirigé vers votre commande dans quelques instants...</p>\n    <p>Si ce n'est pas le cas, <a href=\"http://localhost:3000/order?error=payment_cancelled\">cliquez ici</a>.</p>\n</body>\n</html>"
      tags:
        - Endpoints
      security: []
    parameters:
      -
        in: path
        name: payment
        description: ''
        example: consequatur
        required: true
        schema:
          type: string
