Skip to content

TP1 - Spec API Backend

Vous pouvez étendre/modifier cette spec API à votre guise.

C'est pour donner une idée de ce qui est attendu.

🍸 Unauthenticated routes

POST /auth/register

Appelée quand un user s'enregistre.

Request body :

{
  "username": "meow",
  "password": "s3cr3t_m3ow"
}

Response :

{
  "token": "jwt-token"
}

POST /auth/login

Appelée quand un user (déjà enregistré à priori) se login.

Request body :

{
  "username": "meow",
  "password": "s3cr3t_m3ow"
}

Response :

{
  "token": "jwt-token"
}

POST /vote

Appelée lorsqu'un QRCode est scanné.

Cette route doit être non-authentifiée puisque le QRCode peut être scanné par un autre device que celui qui est utilisé pour visiter le front.

Tu visites avec ton PC, et scan avec ton tél. Cela dit on veut pouvoir authentifier le user qui fait la requête pour comptabiliser le vote. Donc le JWT est bien envoyé.

Request body :

{
  "choiceId": 1,
  "userToken": "jwt-token"
}

🔒 JWT Authenticated routes

Un JWT valide est nécessaire pour accéder à ces pages.

GET /config

Appelée pour que le front obtienne les infos à afficher.

Response :

{
  "question": "How much meow per day would you like ?",
  "voteEndsAt": "2026-01-10T10:30:00Z",
  "choices": [
    {
      "id": 1,
      "label": "1 Meow is nice",
      "qrCodeUrl": "/qrcodes/1"
    },
    {
      "id": 2,
      "label": "2 Meow is better",
      "qrCodeUrl": "/qrcodes/2"
    },
    {
      "id": 3,
      "label": "Yes.",
      "qrCodeUrl": "/qrcodes/3"
    }
  ]
}
 ]
}

GET /qrcodes/{choiceId}

Appelée pour que le front obtienne les 3 images à render.

Response : retourne le QRCode requêté (image/png).

Faut donc aller chercher {QR_STORAGE_PATH}/choice-{id}.png

GET /results

Appelée à intervalles réguliers par le front pour obtenir l'état actuel des votes

Response :

{
  "totalVotes": 42,
  "results": [
    { "choiceId": 1, "label": "1 Meow is nice", "count": 20 },
    { "choiceId": 2, "label": "2 Meow is better", "count": 15 },
    { "choiceId": 3, "label": "Yes.", "count": 7 }
  ]
}