v3 : Décisions et « À venir » côté serveur

- ld-engine/pending : un module (article) reste à voter tant qu'aucune
  version n'a été adoptée par un vote (seed a minima non confirmé, ou pas
  de version en vigueur et au moins une version ouverte) ; les variantes
  comptent pour un ; « sans ton vote » = aucun vote valide sur aucune version.
- overview.rs : GET /api/groups/{slug} ajoute « upcoming » (docs, mandats,
  protocoles), lu au démarrage dans seeds/upcoming/<groupe>.json, trilingue,
  servi seulement à qui ouvre le groupe ; GET /api/groups/{slug}/decisions,
  une ligne par doc avec toVote et withoutMyVote (si la personne vote).
- Retour après connexion par défaut : « / » au lieu de « /groupes ».

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-10-30 09:07:39 +01:00
co-authored by Claude Opus 5.5
parent d400bfc92e
commit c640413a70
7 changed files with 596 additions and 9 deletions
+7 -7
View File
@@ -237,7 +237,7 @@ fn safe_return(raw: Option<&str>) -> String {
{
p.to_owned()
}
_ => "/groupes".to_owned(),
_ => "/".to_owned(),
}
}
@@ -577,12 +577,12 @@ mod tests {
#[test]
fn return_paths_stay_local() {
assert_eq!(safe_return(Some("/g/monnaie-libre")), "/g/monnaie-libre");
assert_eq!(safe_return(Some("//evil.example")), "/groupes");
assert_eq!(safe_return(Some("https://evil.example")), "/groupes");
assert_eq!(safe_return(Some("/\\evil")), "/groupes");
assert_eq!(safe_return(Some("/\t/evil.example")), "/groupes");
assert_eq!(safe_return(Some("/\n/evil.example")), "/groupes");
assert_eq!(safe_return(None), "/groupes");
assert_eq!(safe_return(Some("//evil.example")), "/");
assert_eq!(safe_return(Some("https://evil.example")), "/");
assert_eq!(safe_return(Some("/\\evil")), "/");
assert_eq!(safe_return(Some("/\t/evil.example")), "/");
assert_eq!(safe_return(Some("/\n/evil.example")), "/");
assert_eq!(safe_return(None), "/");
}
#[tokio::test]