Architecture d'un projet Runique
Documentation / Architecture d'un projet Runique / Lifecycle d'une requête

Lifecycle d'une requête

Cycle de vie

1. La requête HTTP arrive
2. Les middlewares sont traversés dans l'ordre des slots (voir Stack middleware) :
   Engine/Tera/Config injectés, IP cliente, hôte vérifié, en-têtes de sécurité…
3. La session est chargée, puis le compte connecté relu en base (request.user)
4. CSRF (méthodes autres que GET/HEAD) : un jeton envoyé en en-tête (X-CSRF-Token)
   est vérifié ici ; un corps qui n'est pas un formulaire sans en-tête, ou un
   formulaire posté depuis un autre site, est refusé (403). Le jeton d'un
   formulaire (champ csrf_token) est vérifié par Prisme à l'étape suivante
5. Le handler reçoit Request : le corps est lu (Prisme), les messages flash de la
   session sont lus et retirés, request.form("nom") construit
   le formulaire, ValidationForm::try_form le valide
6. Le handler retourne AppResult<Response>
7. Les middlewares sont traversés en sens inverse (la session est enregistrée)
8. La réponse HTTP est envoyée

Bonnes pratiques

1. Cloner les Arc

let db = request.engine.db.clone();

2. Formulaires = copies par requête

let mut form: MyForm = request.form("my");
// Chaque requête = formulaire isolé, zéro concurrence

3. context_update! pour le contexte

context_update!(request => {
    "title" => "Ma page",
    "data" => &my_data,
});

4. Flash messages pour les redirections

success!(request.notices => "Action réussie !");
return Ok(Redirect::to("/").into_response());

5. flash_now! pour les rendus directs

context_update!(request => {
    "messages" => flash_now!(error => "Erreur de validation"),
});