meta {
  name: 04 Refresh
  type: http
  seq: 4
}

post {
  url: {{baseUrl}}/api/v1/auth/refresh
  body: none
  auth: none
}

script:post-response {
  if (res.getStatus() === 200) {
    const session = res.getBody().data;
    bru.setEnvVar("token", session.accessToken);
  }
}

tests {
  test("200 OK", function () {
    expect(res.getStatus()).to.equal(200);
  });
  test("nouveau accessToken émis", function () {
    expect(res.getBody().data).to.have.property("accessToken");
    expect(res.getBody().data).to.have.property("expiresAt");
  });
}

docs {
  POST /api/v1/auth/refresh

  Échange le cookie httpOnly `rubis_refresh` (posé automatiquement par
  Signup ou Login) contre une nouvelle AuthSession :
   - nouveau access token JSON (TTL 30 min)
   - nouveau refresh cookie (rotation : l'ancien est révoqué)

  Bruno gère la cookie jar automatiquement → pas besoin d'envoyer le
  cookie manuellement, il est posé par signup/login et présent ici.

  Sécurité — rotation :
   - Si on présente un cookie déjà révoqué (signal de vol), TOUS les
     refresh tokens actifs du user sont invalidés (panic mode).
   - Le hash SHA-256 est stocké en DB, jamais le plain.
   - Cookie scope : `path=/api/v1/auth` → pas envoyé sur les autres routes.

  Erreurs :
   - 401 no_session : pas de cookie envoyé
   - 401 session_expired : cookie inconnu / expiré / révoqué

  Côté SPA : appelé automatiquement au boot pour rehydrater la session
  sans demander un re-login. Et au moment où une requête API renvoie 401,
  le SPA tente un silent refresh puis retry.
}
