chore/sqlx-hygiene #11

Merged
AzSiAz merged 7 commits from chore/sqlx-hygiene into main 2026-07-17 01:29:43 +02:00
Owner

refactor: passe hygiène sqlx — macros partout, pools sans Box::pin

Refactor interne pur, zéro changement de comportement (vérifié mécaniquement en revue finale : aucun fetch_*/.context/rows_affected/savepoint modifié).

Plan : docs/superpowers/plans/2026-07-17-sqlx-hygiene.md

Ce qui change

  • 38 requêtes runtime → macros sqlx::query!/query_as!/query_scalar! (vérification compile-time + cache .sqlx, 38 entrées ajoutées, 0 orpheline) :
    • les deux gardes de rôle (role_guard.rs 11 colonnes, state.rs 14 colonnes + 6 requêtes) — champs nommés au lieu des tuples positionnels, correspondance nom↔expression et polarités vérifiées clause par clause en revue ;
    • documents.rs : 20 sites (listing/get avec les expressions can_*, recherche BM25 opérateur <@> intact, SRF recover_pending_document, upserts de partage ON CONFLICT) ;
    • groups.rs (9) + users.rs (1) — list_admin passe du 8-tuple mappé à query_as!(AdminGroup), colonnes admin_* du LEFT JOIN restent Option (décodage NULL sûr prouvé).
  • Nouveau indara_db::pool::pinned_connect_options(url) : les GUCs de session (search_path = pg_catalog, public, row_security = on) passent en options de démarrage libpq (PgConnectOptions::options()) — les 6 callbacks after_connect/`$
  • Restent volontairement en runtime : les 4 sites SET LOCAL/set_config (session, pas des requêtes de données) et les tests (fixtures ad hoc).

Vérification

  • Le gate exact de la CI : cargo sqlx prepare --check --workspace -- --all-targets vert ; SQLX_OFFLINE=true cargo check --workspace --all-targets vert.
  • cargo test --workspace (16 suites), clippy all-targets -D warnings : 0, les 3 tests RLS --ignored verts.
  • Boots réels contre le compose dev : migrate exit 0, worker sain (logs propres), server healthz ok + login 303.
  • Revue par task (SQL diffé site par site — alias/parenthèses inertes uniquement) + revue finale whole-branch : Ready to merge, 3 minors cosmétiques différés (nommage can_create_db vs can_create_database entre gardes ; test groupe-sans-admin $

Note environnement dev : le volume postgres du compose a dû être recréé pendant la passe (version d'extension incompatible après un pull d'image) — données dev locales réinitialisées, migrations ré-appliquées.

🤖 Generated with Claude Code

# refactor: passe hygiène sqlx — macros partout, pools sans Box::pin Refactor interne pur, **zéro changement de comportement** (vérifié mécaniquement en revue finale : aucun `fetch_*`/`.context`/`rows_affected`/savepoint modifié). Plan : `docs/superpowers/plans/2026-07-17-sqlx-hygiene.md` ## Ce qui change - **38 requêtes runtime → macros `sqlx::query!`/`query_as!`/`query_scalar!`** (vérification compile-time + cache `.sqlx`, 38 entrées ajoutées, 0 orpheline) : - les deux gardes de rôle (`role_guard.rs` 11 colonnes, `state.rs` 14 colonnes + 6 requêtes) — champs nommés au lieu des tuples positionnels, correspondance nom↔expression et polarités vérifiées clause par clause en revue ; - `documents.rs` : 20 sites (listing/get avec les expressions `can_*`, recherche BM25 opérateur `<@>` intact, SRF `recover_pending_document`, upserts de partage ON CONFLICT) ; - `groups.rs` (9) + `users.rs` (1) — `list_admin` passe du 8-tuple mappé à `query_as!(AdminGroup)`, colonnes `admin_*` du LEFT JOIN restent `Option` (décodage NULL sûr prouvé). - **Nouveau `indara_db::pool::pinned_connect_options(url)`** : les GUCs de session (`search_path = pg_catalog, public`, `row_security = on`) passent en options de démarrage libpq (`PgConnectOptions::options()`) — les 6 callbacks `after_connect`/`$ - Restent volontairement en runtime : les 4 sites `SET LOCAL`/`set_config` (session, pas des requêtes de données) et les tests (fixtures ad hoc). ## Vérification - Le gate exact de la CI : `cargo sqlx prepare --check --workspace -- --all-targets` vert ; `SQLX_OFFLINE=true cargo check --workspace --all-targets` vert. - `cargo test --workspace` (16 suites), clippy all-targets `-D warnings` : 0, les 3 tests RLS `--ignored` verts. - Boots réels contre le compose dev : migrate exit 0, worker sain (logs propres), server healthz ok + login 303. - Revue par task (SQL diffé site par site — alias/parenthèses inertes uniquement) + revue finale whole-branch : Ready to merge, 3 minors cosmétiques différés (nommage `can_create_db` vs `can_create_database` entre gardes ; test groupe-sans-admin $ Note environnement dev : le volume postgres du compose a dû être recréé pendant la passe (version d'extension incompatible après un pull d'image) — données dev locales réinitialisées, migrations ré-appliquées. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
AzSiAz self-assigned this 2026-07-17 00:40:55 +02:00
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Renomme l'alias pg_roles.rolcreatedb de "can_create_db!" en
"can_create_database!" dans role_guard.rs pour coller au garde de
référence dans apps/server/src/state.rs, et le champ row.can_create_db
en row.can_create_database. Le texte du message ensure! est inchangé.
Cache sqlx régénéré.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ajoute le test #[ignore] list_admin_decodes_groups_without_admin
(pool owner via DATABASE_URL) : un groupe sans ligne group_members doit
remonter avec admin_user_id None et member_count 0.

Le test a révélé un bug latent : sqlx infère statiquement la PK jointe en
LEFT JOIN (admin_user.id) comme NOT NULL, donc query_as! générait un
décodage non-null et list_admin échouait (UnexpectedNullError) pour tout
groupe sans admin. Corrige groups::list_admin avec l'override
admin_user.id AS "admin_user_id?" pour forcer le décodage nullable dans
Option<Uuid>. Cache sqlx régénéré.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
AzSiAz merged commit b10905b526 into main 2026-07-17 01:29:43 +02:00
AzSiAz deleted branch chore/sqlx-hygiene 2026-07-17 01:29:43 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
AzSiAz/Indara!11
No description provided.